Jan*_*egg 6 c++ gcc clang visual-c++ c-preprocessor
运行以下代码
#include <iostream>
#define FOO
#define BAR defined(FOO)
int main() {
#if BAR
std::cout << "BAR enabled!" << std::endl;
#else
std::cout << "BAR disabled!" << std::endl;
#endif
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在Visual Studio中显示Bar disabled!,同时在gcc或clang显示中运行相同的代码Bar enabled!.
这是Microsoft编译器中的错误吗?根据标准,什么是正确的?
根据标准,这是未定义的行为.
[cpp.cond],强调我的
在评估之前,将替换将成为控制常量表达式的预处理标记列表中的宏调用(除了由
defined一元运算符修改的那些宏名称之外),就像在普通文本中一样.如果defined由于此替换过程而生成令牌,或者defined在宏替换之前使用一元运算符与两个指定表单中的一个不匹配,则行为是未定义的.
| 归档时间: |
|
| 查看次数: |
115 次 |
| 最近记录: |