我想創建包含info(),debug()和error()函數的log.c文件。 這些功能在不打印文件名,行號等的情況下工作。 所以當我調用這個函數時,我想轉儲調用者的文件名,行號和函數名。那麼我們該如何追溯? 有沒有辦法追溯C語言,或者,如果我們使用宏,這又怎麼辦?打印調用函數的文件名,行號和函數名 - C Prog
9
A
回答
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__
5
如果您使用宏,我相信您可以使用__FILE__
,__LINE__
和__FUNCTION__
來完成此項工作。例如,
#define INFO(msg) \
fprintf(stderr, "info: %s:%d: ", __FILE__, __LINE__); \
fprintf(stderr, "%s", msg);
你可以使用的功能太多,但你需要在__FILE__
傳遞等,以確保他們有正確的值。
相關問題
- 1. Nodejs - 打印函數名稱,行號和文件名
- 2. 如何獲取函數調用的文件名和行號?
- 3. log4cplus不打印文件名和行號
- 4. 如何在C++中調用函數時打印每個函數名稱?
- 5. 獲取C函數的名稱給出的文件名和行號 - elisp的
- 6. 調用函數用C用它的名字和函數指針
- 7. 如何在ObjC中獲取調用者函數的文件名和行號?
- 8. 從C++調用函數調用函數名
- 9. 修飾器打印函數調用細節 - 參數名稱和有效值
- 10. 如何使backtrace()/ backtrace_symbols()打印函數名?
- 11. perl:僅打印函數定義名稱
- 12. SymPy只打印函數名稱
- 13. 打印分配給函數指針的函數名稱
- 14. Python日誌記錄(函數名稱,文件名,行號)使用單個文件
- 15. 從函數調用匿名函數
- 16. 當遍歷函數時自動打印每個函數名稱
- 17. 回調,匿名函數和上下文
- 18. 函數中的文件名
- 19. 提取函數名的C文件調用
- 20. 查找文件的行數和列數的函數名稱
- 21. 從javascript中的其他命名函數調用命名函數
- 22. C# - 匿名函數和事件處理
- 23. WebAPI函數中的C#匿名函數?
- 24. 函數名宏C++
- 25. 如何調用自執行匿名函數中的函數?
- 26. 調用函數名稱
- 27. 調用匿名函數
- 28. 名爲自調用函數
- 29. 打印文件名
- 30. 按名稱或簽名計數函數調用。 Gcc,C++
http://stackoverflow.com/questions/2651850/can-func-get-the-lineno-who-call-itself-cc – kennytm 2012-01-16 18:11:59
可能重複[C/C++行號] (http://stackoverflow.com/questions/2849832/cc-line-number) – user7116 2012-01-16 18:17:36
@KennyTM:謝謝!答案就在那裏。 – sura2k 2012-01-17 11:38:09