2014-12-04 83 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 "; 

已提供

所以你必须把它看作一个静态数组,而不是字符串文字;尤其是,您不能将它与其他文字连接起来。

​​
相关问题