2012-10-02 63 views
4

到__FUNCTION__請原諒我,如果我要問一個明顯的問題, 而是通過一堆線程去和嘗試的東西后,我沒能拖住這個簡單的事情。追加一個字符串在宏

我有這個小程序:

#define FUNC_PREFIX __FUNCTION__ "() :" 

int main() 
{ 
    printf("%s\n", FUNC_PREFIX); 
    return 0; 
} 

所以我可以通過FUNC_PREFIX,而不是__FUNCTION__登錄功能,它們將打印調用函數名後加括號和冒號 - 這樣來提高日誌行的可讀性輸出。

編譯沒有作爲,是在Visual Studio 2008中 但在g++,我得到的字符串常量之前預期「)」錯誤

我試着像做了幾件事情:

#define TEMP __FUNCTION__ 
#define FUNC_PREFIX TEMP "() :" 

但無濟於事。

這樣做的方式是什麼?

+0

如果記錄代碼知道它是通過一個函數名,正確的地方加入括號和結腸是日誌代碼。如果日誌記錄代碼不知道它正在獲取函數名稱,那麼您可能需要的信息不僅僅是函數名稱,還可以將其格式化爲包含括號。請注意,使用'#define FUNC_PREFIX __func __,「():」'接受的答案不能用於除'printf'-family函數以外的許多地方。例如,'strcpy(buffer,FUNC_PREFIX)'不會編譯,但'strcpy(buffer,(FUNC_PREFIX))'會 - 但它不會做你想要的。 –

回答

2

您的printf缺少一個報價。使用標識__func__並且可以打印兩個字符串,如果你定義宏爲:

#define FUNC_PREFIX __func__,"() :" 

int main() 
{ 
    printf("%s %s\n", FUNC_PREFIX); 
    return 0; 
} 
+0

感謝您指出報價部分 - 在發佈問題時忘記了包括該部分。 – sskanitk

+0

感謝您的解釋和解答! – sskanitk

7

__FUNCTION__不是標準C或標準C++中的宏。

C++ 2011(§8.4函數定義和§8.4.1一般)和C 1999或2011都有一個預定義的標識符__func__,它是函數的名稱。它不是一個宏,所以你不能在預處理器中連接一個字符串。

所以,你將不得不修改你的代碼,如果它是符合標準的C或不支持擴展MSVS C++編譯器的工作。


GCC手冊(對於版本4.6.1)具有§6.47節的函數名稱作爲字符串。它證明__FUNCTION____func__的同義詞。它還討論了__PRETTY_FUNCTION__。這些不是預處理器宏。因此,您將不得不調整您的代碼才能正確使用gccg++

+0

感謝您的解釋。 – sskanitk