为什么下面的代码会被编译?#ifdef指令末尾的额外令牌
#ifdef C++11
// ...
#endif
int main() {}
GCC 4.8.0给了我以下警告:
额外的令牌在#ifdef指令
末根据标准,宏的名称只能包含字母,数字和下划线字符。
也许是因为这个?
ISO/IEC 14882:2011
16.1条件包含[cpp.cond]
6每个指令的条件是为了检查。如果它的计算结果为 false(零),则它所控制的组被跳过:指令 仅通过确定指令的名称进行处理,以 的顺序跟踪嵌套条件的级别;其余 指令的预处理令牌将被忽略,其他 预处理令牌也会被忽略。只处理控制 条件评估为真(非零)的第一组。如果 条件中没有一个条件的计算结果为true,并且存在#else指令,则处理由#else控制的组 ;缺少#else指令, 直到#endif跳过所有组.151
我无法正确理解此引号。
我相信预处理器标识符遵循与变量标识符相同的规则,尽管大写是首选。 “C++ 11”不起作用。这个SO问题应该可以帮助你:http://stackoverflow.com/questions/10717502/is-there-a-preprocessor-directive-for-detecting-c11x-support – 2013-04-10 20:01:15
@Eric Jablow我知道__cplusplus宏,我想知道为什么这个代码编译在gcc 4.8.0,clang 3.2,icc 13.0.1和MSVC-11 – FrozenHeart 2013-04-10 20:26:47
对不起。我应该读得更好。也许GCC太宽容了。 – 2013-04-10 20:40:59