2010/07/01

LinuxC - gcc 預先定義的巨集

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

沒有留言:

張貼留言