我在移动一些代码,GCC 4.7(4.6),撞上了几个编译器错误,发现中记录的问题GCC 4.7移植指南 :
用户定义的文字和空白
C ++编译器在ISO C11模式
std={c++11,c++0x,gnu++11,gnu++0x}
支持用户定义的文字,这与一些有效的ISO C ++ 03代码不兼容。特别是,现在需要一个字符串后面的空格文字和之前的东西,可能是文字中定义的有效用户。 采取有效的ISO C ++代码03
const char *p = "foobar"__TIME__;
在C ++ 03, 时间宏扩展到一些字符串文字和的值与另一个。 在C ++ 11
__TIME__
没有展开,而不是operator "" __TIME__
正在抬头,从而导致以下诊断:error: unable to find string literal operator 'operator"" __TIME__'
这适用于任意的字符串文字不跟随一些宏观空白。 要解决,只是添加字符串常量和宏的名称之间的一些空白。
虽然我可以修复错误,我想知道为什么我必须这样做。 __TIME__
是一个宏观的,所以"something"__TIME__
会变成"something""15:52:03"
在预处理阶段(或类似),因此编译器将永远不会有机会看到它作为operator ""
。
这是行为规范批准的或者是一个错误吗?