g ++ 4.7将运算符""评估为宏扩展的兄弟

Tra*_*kel 13 c++ compilation user-defined-literals gcc4.7

我正在将一些代码移到GCC 4.7(从4.6)并遇到一些编译错误,并发现GCC 4.7移植指南中记录的问题:

用户定义的文字和空格

ISO C11模式下的C++编译器std={c++11,c++0x,gnu++11,gnu++0x} 支持用户定义的文字,这些文字与某些有效的ISO C++ 03代码不兼容.

特别是,现在需要在字符串文字之后和可能是有效的用户定义文字之前的空格.获取有效的ISO C++ 03代码

const char *p = "foobar"__TIME__;
Run Code Online (Sandbox Code Playgroud)

在C++ 03中,TIME宏扩展为某个字符串文字,并与另一个字符串连接.在C++ 11 __TIME__中没有扩展,而是operator "" __TIME__被查找,导致以下诊断:

error: unable to find string literal operator  ‘operator"" __TIME__’
Run Code Online (Sandbox Code Playgroud)

这适用于某些宏后面没有空格的任何字符串文字.要修复,只需在字符串文字和宏名称之间添加一些空格.

虽然我可以修复错误,但我想知道为什么我必须这样做.__TIME__是一个宏,因此"something"__TIME__"something""15:52:03"在预处理阶段变为(或类似),因此编译器永远不会有机会将其视为operator "".

这种行为是标准认可还是错误?

bam*_*s53 16

问题是"foobar"__TIME__不再将其标记为预处理器标记"foobar"后跟__TIME__.

预处理程序标记"具有关键字,标识符,文字,运算符或标点符号的词法形式." 添加用户定义的文字会更改作为预处理程序令牌的词汇.现在"foobar"__TIME__是单个用户定义的字符文字预处理器令牌,因此当转换的第4阶段(将替换__TIME__为)时"15:52:03",没有__TIME__令牌以这种方式被替换.

是的,此行为在标准中指定.

由于cinttypes宏,看起来比委员会意识到更多的代码受此影响,他们正在考虑解决它.有些编译器已经开始处理cinttypes的问题了,但是不能解决这个问题__TIME__.我认为你最好的办法是改变代码.