c - MAX 使用 gcc 的 typeof 扩展

标签 c gcc macros

我用 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/

相关文章:

c - 自复制程序

algorithm - 这个循环优化叫什么,它是如何工作的?

c++ - 如何使用 gcc 编译 SIMD 代码

c - 宏中的意外结果

c - 使用 setsockopt;当套接字从另一端关闭时,read 返回 0 而不是 -1

c - 哪个是最适合初学者的 C IDE?

c - 如何等到文件在 C 中创建

c++ - 为 AVR 编译 c++0x

c++ - 定义指数预处理器宏

c++ - 通过 pragma 消息打印基于其他宏的定义的数值?