C++中条件语句内使用#define出现异常输出,求原因解析
为什么在C++条件语句中使用#define会出现异常结果?
你尝试在C++条件语句中使用#define预编译指令,却得到了和预期不符的结果,代码如下:
// The mode is forward by default #define FOR if ( mode == "forward") { clog << "mode == forward" << endl; } else if (mode == "reverse") { clog << "Enter reverse" << endl; #define REV #undef FOR } else { cerr << "NOT A VALID MODE (FORWARD OR REVERSE)" << endl; } #ifdef FOR cout << "Switch to forward mode." << endl; #endif #ifdef REV cout << "Switch to reverse mode." << endl; #endif
运行后输出:
mode == forward Switch to reverse mode
你的推测完全正确,问题核心就是预编译阶段的执行逻辑,具体原因如下:
#define、#undef、#ifdef这类预编译指令,是在程序编译之前就被处理的,完全不考虑程序运行时的if/else条件判断。预处理器只会按代码的书写顺序,逐行扫描并执行所有预编译指令,不管它们嵌套在哪个代码块里。- 你的代码里,预处理器先执行了
#define FOR,然后扫描到else if块里的#define REV和#undef FOR,就直接执行这两个指令——此时它完全不管这个else if块在运行时会不会被执行,只是单纯处理文本层面的预编译指令。 - 等到处理后面的
#ifdef FOR时,FOR已经被#undef取消定义了,而REV已经被定义,所以只有cout << "Switch to reverse mode." << endl;会被保留到编译后的代码里。
简单说,预编译指令是编译前的文本替换工具,不能用来实现运行时的条件逻辑。如果要实现运行时的模式切换,应该用普通变量(比如bool isForward = true;)来控制。
内容的提问来源于stack exchange,提问作者Zahi
相关产品推荐
相关产品推荐

