易春木

Feed Rss

LinuxC - gcc 預先定義的巨集

07.01.2010, IT開發, by , 2,331 人次 .

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

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

1 則回應給 LinuxC - gcc 預先定義的巨集

  1. 2010-07-07 at 11:51 易春木

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

發表迴響

您的電子郵件位址並不會被公開。 必要欄位標記為 *

*

您可以使用這些 HTML 標籤與屬性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>