我用 C 编程已经有一段时间了。所以我决定学习一些高级 C。我听说过 gcc 编译器扩展。下面我看到了 MAX() 的代码,我到目前为止已经实现如下
#define MAX(x,y) ((x) > (y)? (x): (y))
这是我找到的新定义。不幸的是,我什至无法理解下面代码的作用?为什么我会按照下面而不是上面的方式来做?
#define MAX(a,b) \
({ \
typeof (a) _a = (a); \
typeof (b) _b = (b); \
_a > _b ? _a : _b; })
最佳答案
优点是它避免了与经典宏一样多次评估参数。
通过引入局部变量(使用 typeof
来“克隆”参数的类型),实际的表达式只计算一次,然后返回值只是使用局部变量而不是计算再次输入表达式,就像经典宏所要做的那样。
比较这样调用会发生什么:
int a = 0, b = 1;
const int c = MAX(++a, ++b);
第一种情况,因为输入的表达式有副作用,所以结果很难预测。在第二种情况下,参数只被评估一次,所以一切都表现得好像 MAX()
是一个常规函数。
此外,您的第一个宏示例未能在任何地方将参数括在括号中,这很危险。
关于c - MAX 使用 gcc 的 typeof 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17039325/