为什么下面的代码会编译?
#ifdef C++11
// ...
#endif
int main() {}
Run Code Online (Sandbox Code Playgroud)
gcc 4.8.0 给了我以下警告:
#ifdef 指令末尾的额外标记
根据标准,宏名称只能包含字母、数字和下划线字符。
也许是因为这个?
ISO/IEC 14882:2011
16.1 条件包含 [cpp.cond]
6 按顺序检查每个指令的条件。如果它评估为假(零),则跳过它控制的组:指令仅通过确定指令的名称进行处理,以跟踪嵌套条件的级别;指令的其余预处理标记将被忽略,组中的其他预处理标记也将被忽略。仅处理其控制条件评估为真(非零)的第一组。如果所有条件的计算结果都不为真,并且存在 #else 指令,则处理由 #else 控制的组;缺少#else 指令,直到#endif 的所有组都被跳过。151
我无法正确理解这句话。
A#ifdef定义如下(取自\xc2\xa716.1)
\n\n\n\n
# ifdef标识符换行符
使用类似正则表达式的表示法,标识符为:[a-zA-Z_][a-zA-Z_0-9]*(*)
要点是:您声明的宏不是 NOTC++11。事实上确实如此C(参见这个实例)。该++11部分被预处理器忽略。标识符(即C)后唯一允许的字符是换行符,但正如 hvd\'s 答案中所述,来自 \xc2\xa71.4,语法错误仅强制显示诊断消息,此处为警告;我看到这个而不是错误的唯一原因是与旧代码兼容,旧代码应该使用这些名称。
另外:引用解释了如何#ifdef / #elif / #else / #endif协同工作,而不是指定条件的方式。
我没有该标准的副本。我使用草案n3485来回答这个问题。
\n\n(*)标识符中可以包含实现定义的字符,但这不会影响您的问题。请注意,变量、类名、宏……都遵循相同的标识符规则。
\n| 归档时间: |
|
| 查看次数: |
17072 次 |
| 最近记录: |