1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
1. __BASE_FILE__ 完整的原始檔案路徑 2. __cplusplus 表示該檔案由 g++ 所編譯,當成 C++ 的檔案 3. __DATE__ 編譯的日期 4. __TIME__ 編譯的時間 5. __FILE__ 原始檔名 6. __LINE__ 所在行數 7. __VERSION__ gcc 版本 8. __func__ 替代 __FUNCTION__,__FUNCTION__ 已被 GNU 不推薦使用 |
GCC提供三個能夠給出當前函數名的神奇變數,第一個變數是”__func__”,其是C99標準的一部分:
識別字”__func__”由轉譯器隱式聲明,就像函數定義的開始花括弧緊跟它的後面,其聲明如下
static const char __func__[] = “function-name”;
其中”function-name”即是函數的詞條名,此名尚未被變形。
“__FUNCTION__” 是”__func__”的一個別名。舊版本的GCC只認得這個名稱。然而,它還未被標準化,為了獲取最大可能的移植性推薦使用”__func__”代之,可通過預處理器宏提供向後相容:
1 2 3 4 5 6 7 |
#if __STDC_VERSION__ < 199901L # if __GNUC__ >= 2 # define __func__ __FUNCTION__ # else # define __func__ "" # endif #endif |
在C中,”__PRETTY_FUNCTION__”也是”__func__”的另一個別名。然而,在C++中,除了包含函數裸名外,還包含函數簽名。例如,看下麵的程式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
extern "C" { extern int printf (char *, ...); } class a { public: void sub (int i) { printf ("__FUNCTION__ = %s\n", __FUNCTION__); printf ("__PRETTY_FUNCTION__ = %s\n", __PRETTY_FUNCTION__); } }; int main (void) { a ax; ax.sub (0); return 0; } |
產生如下的輸出:
1 2 |
__FUNCTION__ = sub __PRETTY_FUNCTION__ = void a::sub(int) |
這些識別字並非預處理器宏。在GCC 3.3和早期版本中,僅限於C中”__FUNCTION__”和”__PRETTY_FUNCTION__”被作為字面量,它們可被用於初始化字元陣列, 也可與其他字串相連接。GCC 3.4和後來版本,像”__func”一樣將它們作為變數。在C++中,”__FUNCTION__”和 “__PRETTY_FUNCTION__”總被作為變數。
reference: http://jyhshin.pixnet.net/blog/post/26588145
所以DEBUG可以使用 printf(“%s:%s:(%d): “, __FILE__, __FUNCTION__, __LINE__);