2012-01-16 16 views
9

info(), debug() ve error() işlevlerini içeren log.c dosyası oluşturmak istiyorum. Bu işlevler, dosya adı, satır numarası, vb. Yazdırmadan çalışır. Bu işlevlerden birini çağırdığımda, arayanın dosya adını, satır numarasını ve işlev adını dökmek istiyorum. Peki tam olarak nasıl geri izleriz? C'yi izlemek için bir yol var mı, yoksa makroları kullanırsak, bu nasıl yapılabilir?Arama adını, satır numarasını ve arama işlevinin işlev adını yazdır - C Prog

+0

http://stackoverflow.com/questions/2651850/can-func-get-the-lineno-who-call-itself-cc – kennytm

+1

(http://stackoverflow.com/questions/2849832/cc-line-number) – user7116

+0

@KennyTM: Teşekkürler! Cevap var. – sura2k

cevap

21

Ben

int info(const char *fname, int lineno, const char *fxname, ...) { /* ... */ } 
int debug(const char *fname, int lineno, const char *fxname, ...) { /* ... */ } 
int error(const char *fname, int lineno, const char *fxname, ...) { /* ... */ } 

(belki bir makro yardım almak) Ve onları aramak için parametreler aracılığıyla işlevine verileri geçerdi

info(__FILE__, __LINE__, __func__, ...); 
debug(__FILE__, __LINE__, __func__, ...); 
error(__FILE__, __LINE__, __func__, ...); 

Not: __func__ C99 olduğu; gcc, C89 modunda, [C/C++ satır numarası] muhtemel kopyası olan __FUNCTION__

+0

__FILE __, .. vb parametrelerini geçmeden her zaman bu tür fonksiyonlar yaratmanın bir yolu var mı? – sura2k

+8

Evet, bir makro ile. Örneğin, C99 için (variadic makroları vardır): '#define INFO (...) bilgisi (__ FILE__, __LINE__, __func__, __VA_ARGS __)' – pmg

+0

Teşekkürler! İhtiyacım olan buydu. – sura2k

5

Makrolar kullanırsanız, bunu, __LINE__ ve __FUNCTION__ kullanarak gerçekleştirebilirsiniz. Örneğin,

#define INFO(msg) \ 
    fprintf(stderr, "info: %s:%d: ", __FILE__, __LINE__); \ 
    fprintf(stderr, "%s", msg); 

Sen de işlevlerini kullanabilirsiniz, ama emin onlar doğru değeri vardı yapmak için, __FILE__ vb geçmesi gerekir.

+1

'gcc -std = gnu99',' __LINE__' bir tamsayıdır ve 'char *' 'a çevirme konusunda uyarır. İkinci satır "fprintf" (stderr, "info:% s:% d:", __FILE__, __LINE__); \ '('% s', '% d' ile değiştirildi)? – matec

+0

Sabit! Oradaki bazı eski okul Python'unu sızdırıyor. – Michael

İlgili konular