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

閱讀這篇文章的讀者也會看:

One Response to “LinuxC – gcc 預先定義的巨集”

  1. 易春木 說道:

    所以DEBUG可以使用 printf(『%s:%s:(%d): 『, __FILE__, __FUNCTION__, __LINE__);

本篇文章的迴響 RSS 訂閱。 TrackBack URI

Leave a reply