2012-01-16 33 views
9

我想創建包含info(),debug()和error()函數的log.c文件。 這些功能在不打印文件名,行號等的情況下工作。 所以當我調用這個函數時,我想轉儲調用者的文件名,行號和函數名。那麼我們該如何追溯? 有沒有辦法追溯C語言,或者,如果我們使用宏,這又怎麼辦?打印調用函數的文件名,行號和函數名 - C Prog

+0

http://stackoverflow.com/questions/2651850/can-func-get-the-lineno-who-call-itself-cc – kennytm 2012-01-16 18:11:59

+1

可能重複[C/C++行號] (http://stackoverflow.com/questions/2849832/cc-line-number) – user7116 2012-01-16 18:17:36

+0

@KennyTM:謝謝!答案就在那裏。 – sura2k 2012-01-17 11:38:09

回答

21

我會通過參數傳遞數據的功能(可能得到一個宏的幫助下)

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, ...) { /* ... */ } 

,並呼籲他們

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

注:__func__是C99; gcc,在模式C89有__FUNCTION__

+0

有沒有辦法來創建這些類型的功能,而無需傳遞__FILE __,.. etc參數? – sura2k 2012-01-17 11:10:52

+8

是的,有一個宏。例如,對於C99(具有可變宏):'#define INFO(...)info(__ FILE__,__LINE__,__func__,__VA_ARGS __)' – pmg 2012-01-17 11:20:01

+0

謝謝!這就是我需要的。 – sura2k 2012-01-17 11:37:23

5

如果您使用宏,我相信您可以使用__FILE____LINE____FUNCTION__來完成此項工作。例如,

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

你可以使用的功能太多,但你需要在__FILE__傳遞等,以確保他們有正確的值。

+1

'gcc -std = gnu99'表示'__LINE__'是一個整數,並警告將它轉換爲'char *'。第二行不應該是'fprintf(stderr,「info:%s:%d:」,__FILE__,__LINE__); \'('%s'替換爲'%d')? – matec 2014-02-13 18:15:29

+0

已修復!在那裏泄漏一些老派的Python。 – Michael 2014-02-13 21:05:47