面试题答案
一键面试C++宏定义可能带来的副作用
- 宏展开导致的意外行为:宏是简单的文本替换,在替换时可能会因为优先级等问题产生意外结果。例如:
#define ADD(a, b) a + b
int result = ADD(2, 3) * ADD(4, 5);
// 展开后为 2 + 3 * 4 + 5 ,结果为19,而不是预期的(2 + 3) * (4 + 5) = 45
- 命名冲突:宏定义在全局作用域,可能会与其他标识符冲突。例如项目中不同模块定义了相同名字的宏,会导致难以调试的错误。
- 调试困难:宏展开后,调试信息中代码与原始代码差异较大,使得定位问题变得困难。
避免副作用的常用方法
使用括号包裹宏定义中的参数和表达式。例如将上面的 ADD
宏修改为:
#define ADD(a, b) ((a) + (b))
int result = ADD(2, 3) * ADD(4, 5);
// 展开后为 ((2) + (3)) * ((4) + (5)) ,结果为45,符合预期
这样可以避免因运算符优先级问题导致的意外结果。