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__”代之,可通過預處理器宏提供向後相容:
#if __STDC_VERSION__ < 199901L # if __GNUC__ >= 2 # define __func__ __FUNCTION__ # else # define __func__ "" # endif #endif
在C中,”__PRETTY_FUNCTION__”也是”__func__”的另一個別名。然而,在C++中,除了包含函數裸名外,還包含函數簽名。例如,看下麵的程式:
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; }
產生如下的輸出:
__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
沒有留言:
張貼留言