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

时间:2012-08-10 21:58:10

标签: c++ compilation user-defined-literals gcc4.7

我正在将一些代码移到GCC 4.7(从4.6开始)并遇到一些编译器错误,发现问题记录在GCC 4.7 porting guide中:

  

用户定义的文字和空格

     

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

     

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

const char *p = "foobar"__TIME__;
     

在C ++ 03中, TIME 宏扩展为某些字符串文字并且是   与另一个连在一起。在C ++ 11中__TIME__未展开,   相反operator "" __TIME__被查找,导致了。{   以下诊断:

error: unable to find string literal operator  ‘operator"" __TIME__’
     

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

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

此行为标准是否已获批准或是否为错误?

1 个答案:

答案 0 :(得分:16)

问题是,"foobar"__TIME__不再被标记为预处理程序令牌"foobar",后跟__TIME__

预处理程序令牌“具有关键字,标识符,文字,运算符或标点符号的词法形式。”添加用户定义的文字会更改作为预处理程序令牌的词汇。现在"foobar"__TIME__是一个用户定义的字符 - 文字预处理程序令牌,因此当转换的第4阶段发生时,__TIME__会替换为"15:52:03" ,没有__TIME__令牌可以这样替换。

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

由于cinttypes宏,看起来更多的代码受到影响而不是委员会意识到并且他们正在考虑解决它。一些编译器已经开始处理cinttypes的问题,但是不能解决这种__TIME__的使用问题。我认为你最好的办法就是改变代码。