我正在将一些代码移到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 ""
。
此行为标准是否已获批准或是否为错误?
答案 0 :(得分:16)
问题是,"foobar"__TIME__
不再被标记为预处理程序令牌"foobar"
,后跟__TIME__
。
预处理程序令牌“具有关键字,标识符,文字,运算符或标点符号的词法形式。”添加用户定义的文字会更改作为预处理程序令牌的词汇。现在"foobar"__TIME__
是一个用户定义的字符 - 文字预处理程序令牌,因此当转换的第4阶段发生时,__TIME__
会替换为"15:52:03"
,没有__TIME__
令牌可以这样替换。
是的,此行为在标准中指定。
由于cinttypes宏,看起来更多的代码受到影响而不是委员会意识到并且他们正在考虑解决它。一些编译器已经开始处理cinttypes的问题,但是不能解决这种__TIME__
的使用问题。我认为你最好的办法就是改变代码。