13

我正在将一些代码移至 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 ""

这种行为标准是批准的还是一个错误?

4

1 回答 1

16

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

预处理器标记“具有关键字、标识符、文字、运算符或标点符号的词法形式”。添加用户定义的文字会改变作为预处理器标记的词法。Now"foobar"__TIME__是单个用户定义的字符文字预处理器标记,因此当翻译的第 4 阶段发生时,它将替换__TIME__"15:52:03",没有__TIME__标记可以以这种方式被替换。

是的,标准中规定了这种行为。

由于 cinttypes 宏,受此影响的代码似乎比委员会意识到的要多,他们正在考虑解决它。一些编译器已经开始处理 cinttypes 的问题,但不是以一种可以__TIME__为您解决这种用法的方式。我认为您最好的选择是更改代码。

于 2012-08-10T22:09:03.450 回答