我有一些代码我维护我已经开始在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)编译得很好。
编译器是否有错误?
答案 0 :(得分:8)
这是因为“”_是用户定义的字符串文字的语法。在它们之间放置一个空格以具有旧行为(连接文字)。 GCC工作正常,因为4.4.7没有实现用户定义的文字(it appeared in version 4.7)。
另外,正如@Fred指出的那样,尽量避免使用保留标识符(双下划线)。