为什么clang将其解析为用户定义的文字?

时间:2013-08-05 21:25:46

标签: c++ c++11 g++ clang++

我有一些代码我维护我已经开始在clang 3.3下编译。 使用“-std = c ++ 11”进行编译时,clang会生成错误(如下所示)。我已经将违规代码提炼为以下内容:

#include <stdio.h>

#define DBG_PRT(__format, ...) \
         printf("%s:%d:%s: "__format, __FILE__, \
                       __LINE__, __FUNCTION__, ## __VA_ARGS__)

int main()
{
    DBG_PRT("%s\n", "Hi");
}

这是铿锵的输出:

  

test.cpp:10:5:错误:没有匹配的文字运算符用于调用   'operator'“__ format”,参数类型为'const char *'和   'unsigned int'

DBG_PRT("%s\n", "Hi");

^ test.cpp:4:29: note: expanded from macro 'DBG_PRT'
     printf("%s:%d:%s: "__format, __FILE__, \
                        ^ 1 error generated.

在字符串文字和“__format”之间没有空格,似乎预处理器不应该能够扩展__format。但是,当没有指定-std = c ++ 11时,它显然是 。 G ++ 4.4.7(有和没有-std = c ++ 0x)编译得很好。

编译器是否有错误?

1 个答案:

答案 0 :(得分:8)

这是因为“”_是用户定义的字符串文字的语法。在它们之间放置一个空格以具有旧行为(连接文字)。 GCC工作正常,因为4.4.7没有实现用户定义的文字(it appeared in version 4.7)。

另外,正如@Fred指出的那样,尽量避免使用保留标识符(双下划线)。