克++ 4.7评估操作员“”作为同级宏扩展(g++ 4.7 evaluates operator “

2019-06-26 23:11发布

我在移动一些代码,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 ""

这是行为规范批准的或者是一个错误吗?

Answer 1:

问题是, "foobar"__TIME__不再标记化到预处理令牌"foobar" ,然后__TIME__

预处理程序标记“有一个关键字,一个标识符,一个文字,操作者,或标点的词汇表”。 添加用户自定义文字的变化是什么lexed作为预处理记号。 现在, "foobar"__TIME__是一个用户自定义的字符,文字的预处理记号,所以当翻译的阶段4时,将取代__TIME__"15:52:03" ,没有__TIME__得到更换此令牌办法。

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

由于cinttypes宏看起来更多的代码是由这比委员会意识到影响,他们正在考虑解决它。 一些编译器已经正在处理与cinttypes问题,但是没有一种方式,可以解决这个问题使用__TIME__你。 我认为最好的办法是只需更改代码。



文章来源: g++ 4.7 evaluates operator “” as sibling to macro expansion