5

我有一些我正在维护的代码,我已经开始在 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");
}

这是clang的输出:

test.cpp:10:5: 错误:没有匹配的文字运算符用于调用具有类型 'const char *' 和 'unsigned int' 的参数的 'operator "" __format'

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)编译得很好。

编译器有错误吗?

4

1 回答 1

9

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

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

于 2013-08-05T21:40:06.993 回答