我正在将一些代码移至 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__;
在 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 ""
。
这种行为标准是批准的还是一个错误?