我已经在C中编程了很长一段时间.所以我决定学习一些关于gcc编译器扩展的高级CI.我看到了MAX()的代码,我现在已经实现如下
#define MAX(x,y) ((x) > (y)? (x): (y))
Run Code Online (Sandbox Code Playgroud)
这是我发现的新定义.遗憾的是,我甚至无法理解下面代码的作用?为什么我会这样做,而不是如上所述?
#define MAX(a,b) \
({ \
typeof (a) _a = (a); \
typeof (b) _b = (b); \
_a > _b ? _a : _b; })
Run Code Online (Sandbox Code Playgroud)
优点是它避免了像经典宏一样多次评估参数.
通过引入局部变量(typeof用于"克隆"参数的类型),实际表达式仅被计算一次,返回值则只是使用局部变量而不是再次评估输入表达式,因为经典宏必须这样做.
比较如果这样调用会发生什么:
int a = 0, b = 1;
const int c = MAX(++a, ++b);
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,因为输入表达式具有副作用,所以结果将难以预测.在第二种情况下,参数仅被评估一次,因此一切行为就像MAX()是常规函数一样.
此外,您的第一个宏示例是无法将参数括在括号中的任何地方,这很危险.