我正在嘗試構建一個調試日誌消息函數,該函數記錄日誌消息從何處被調用的文件,行和函數。函數名稱的預定義宏__func__
#define DEBUG_PANIC(p) CLogging::Debuglogf("Debug marker (%s) - ::%s() in file: %s(%d)", p, __func__ , __FILE__, __LINE__);
上面的代碼適用於一些編譯器,但不是全部。我的代碼需要與GCC以及Microsoft Visual Studio交叉兼容。我已經添加了下面的定義來幫助兼容性。
#ifndef __FUNCTION_NAME__
#if defined __func__
// Undeclared
#define __FUNCTION_NAME__ __func__
#elif defined __FUNCTION__
// Undeclared
#define __FUNCTION_NAME__ __FUNCTION__
#elif defined __PRETTY_FUNCTION__
// Undeclared
#define __FUNCTION_NAME__ __PRETTY_FUNCTION__
#else
// Declared
#define __FUNCTION_NAME__ "N/A"
#endif // __func__
#endif // __FUNCTION_NAME__
#define DEBUG_PANIC(p) CLogging::Debuglogf("Debug marker (%s) - ::%s() in file: %s(%d)", p, __FUNCTION_NAME__, __FILE__, __LINE__);
與上面代碼段的問題是,它是的#else宏是在所有的編譯器活性,而其他的宏都沒有。換句話說#if defined __func__
在編譯器上是錯誤的,其中__func__
是預定義的宏。
我的問題是
- 如何創建一個交叉編譯器宏找到函數的名字嗎?
- 如何判斷是否可以使用
__func__
?
你在寫C或C++嗎? – 2013-03-09 00:01:41
@KeithThompson對不起,我忘了,這增加的問題,是C++ – 2013-03-09 00:28:03