2014-12-04 29 views
0

我想在C++中concordate __ func__和文字字符串,並且在GCC(有或沒有C++ 11標準)上出現錯誤。例如,像這樣:C++ Concatinating __func__和常量字符文字

#include <cstdio> 

int main(void) 
{ 
     printf("%s", __func__ " try #1\n"); 
     printf(__func__ " try #2\n"); 
     return 0; 
} 

看起來像__ func__實際上不是字符串文字宏。有誰知道爲什麼會發生這種情況,也許有辦法解決它?

+3

當然'__func__'不是一個啞字符串宏。 「%s%s」有什麼問題?另外使用合適的C++工具有什麼問題,比如'std :: string'和'std :: cout'? – Griwes 2014-12-04 14:00:11

+1

@Griwes「當然」?考慮到'__FILE__'和'__LINE__' *是宏,我可以理解OP爲什麼會認爲'__func__'也是。 – hvd 2014-12-04 14:01:37

+0

'printf(「%s try#1 \ n」,__func__)'有什麼問題?您嘗試執行的編譯時級聯的類型僅適用於字符串文本(即常量字符串)。 – 2014-12-04 14:02:43

回答

2

從技術上講,__func__預定義的標識符。這是從來沒有作爲一個宏實現。

它有static const char __func__[]類型,所以你不能按照你的方式連接它。當然,你可以把它加到std::string

使用

printf("%s try #1\n", __func__);

代替。

+0

感謝您對__ func__的解釋。我真的想過使用__ func__作爲字符串文字,現在我認爲這是不可能的。 – 2014-12-04 14:13:10

5

__func__確實既不是字符串字面也不是宏。其從C++ 11 8.4.1/8規範是

功能本地預定義的變量__func__被定義爲如果窗體的定義

static const char __func__[] = "function-name "; 

已提供

所以你必須把它看作一個靜態數組,而不是字符串文字;尤其是,您不能將它與其他文字連接起來。

​​