为什么我代码中针对函数使用的#undef指令没有生效?
根本原因
C 语言的#define、#ifdef、#undef都属于预处理指令,仅在编译的预处理阶段按代码的文本顺序逐行执行,是编译期行为,和程序运行时的逻辑完全无关。你代码的预处理顺序直接导致了#undef不生效:
- 预处理第一步处理开头的
#define noprint,预处理器标记noprint为已定义状态 - 下一步处理
print函数的代码,此时#ifdef noprint判断成立,预处理器会直接删掉#else分支的代码,最终生成参与编译的print函数代码为:
void print() { return; }
- 等预处理器处理到
main函数里的#undef noprint时,才会取消noprint的定义,但此时print函数的代码已经预处理完成,固定为直接返回的逻辑,后续的#undef对已经处理完成的代码不会产生任何影响。
解决方案
如果要让取消宏的操作对print函数生效,只需要调整#undef的位置,放到print函数定义之前即可:
#define noprint // 放在print函数定义前取消宏 #undef noprint void print() { #ifdef noprint return; #else //do stuff #endif } main() { print(); }
如果需要在运行时动态控制print的行为,就不要使用编译期的宏判断,改用运行期的变量控制逻辑即可。
内容的提问来源于stack exchange,提问作者user15114051
相关产品推荐
相关产品推荐

