面试题答案
一键面试1. #undef取消宏定义的机制和时机
- 机制:
#undef
指令用于取消之前通过#define
定义的宏。它的作用是告诉预处理器不再将后续代码中出现的宏标识符替换为相应的替换文本。在预编译阶段,预处理器会按照从上到下的顺序扫描源文件,当遇到#undef
指令时,它会在其符号表中删除对应的宏定义。 - 时机:
#undef
在预编译阶段起作用,在编译器进行语法分析和语义分析之前。一旦执行了#undef
,后续代码中对该宏的使用将被视为未定义,可能会导致编译错误(如果编译器开启了严格的未定义标识符检查)。
2. 复杂嵌套宏定义环境下#undef的连锁反应
在复杂的嵌套宏定义环境中,#undef
一个宏可能会影响依赖它的其他宏定义。如果一个宏被#undef
,那么依赖它的上层宏可能会因为缺少该宏而无法正确展开,导致编译错误或出现意外的替换结果。
3. 代码示例
#include <stdio.h>
// 定义一个简单宏
#define A 10
// 定义一个依赖A的嵌套宏
#define B (A + 5)
// 定义一个依赖B的嵌套宏
#define C (B * 2)
int main() {
// 打印宏C的结果
printf("C before #undef A: %d\n", C);
// 取消宏A的定义
#undef A
// 尝试打印宏C的结果,此时A已被#undef,C的展开会出错
// 这里在实际编译时会报错,因为A未定义
// printf("C after #undef A: %d\n", C);
return 0;
}
在上述代码中,首先定义了宏A
,然后基于A
定义了宏B
,又基于B
定义了宏C
。在main
函数中,先打印了宏C
的结果。接着使用#undef A
取消了宏A
的定义。如果尝试在#undef A
之后再次打印宏C
的结果,编译器会报错,因为宏C
的展开依赖宏A
,而此时A
已被取消定义。这展示了在复杂嵌套宏定义环境下,#undef
操作对整个预编译结果产生的连锁反应。