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

Joh*_*ohn 4 c++ g++ c++11 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");
}
Run Code Online (Sandbox Code Playgroud)

这是铿锵的输出:

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.
Run Code Online (Sandbox Code Playgroud)

如果字符串文字和"__format"之间没有空格,那么预处理器似乎不应该能够扩展__format.但是,当没有指定-std = c ++ 11时,显然是这样.G ++ 4.4.7(有和没有-std = c ++ 0x)编译得很好.

编译器有错误吗?

小智 8

这是因为""_是用户定义的字符串文字的语法.在它们之间放置一个空格以具有旧行为(连接文字).GCC工作正常,因为4.4.7没有实现用户定义的文字(它出现在4.7版本中).

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