MST

星途 面试题库

面试题:复杂场景下C++宏定义副作用的分析与解决

假设有如下宏定义:#define MAX(a, b) ((a) > (b)? (a) : (b))。在一段代码中使用int x = 5, y = 10; int result = MAX(x++, y++); 分析这里可能出现的宏定义副作用,并提出改进方案,同时解释改进的原理。
14.5万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

宏定义副作用分析

  1. 副作用情况:在 int result = MAX(x++, y++); 中,由于宏定义 MAX(a, b) ((a) > (b)? (a) : (b)) 只是简单的文本替换,会被替换为 ((x++) > (y++)? (x++) : (y++))。这会导致 xy 可能会被多次自增,结果取决于 x++y++ 的比较结果。
  2. 举例说明:假设初始 x = 5y = 10(x++) > (y++) 比较时,先使用 xy 的值进行比较(即 510),然后 xy 各自自增为 611。因为 5 < 10,所以取 y++y 再次自增为 12。此时 x 自增了一次变为 6y 自增了两次变为 12

改进方案

  1. 使用函数替代宏
int max(int a, int b) {
    return a > b? a : b;
}
  1. 使用宏改进
#define MAX(a, b) ({ \
    typeof(a) _a = (a); \
    typeof(b) _b = (b); \
    _a > _b? _a : _b; \
})

改进原理

  1. 函数替代宏:函数调用时参数只会计算一次,在 int result = max(x++, y++); 中,x++y++ 作为参数传递给函数 maxxy 各自只会自增一次,避免了宏定义中多次自增的副作用。
  2. 宏改进:使用 typeof 来获取变量类型,创建临时变量 _a_b 来存储 ab 的值。这样在比较和返回结果时使用的是临时变量,原变量 ab 不会被多次操作,避免了副作用。例如在 int result = MAX(x++, y++); 中,xy 各自只会自增一次。