GNU C 中对min宏可进行如下定义:

#define min(x, y) ({        \
    const typeof(x) _x = (x);        \
    const typeof(y) _y = (y);        \
    (void) (&_x == &_y);        \
    _x < _y ? _x : _y;        \
})

因为重新定义了 _x 和 _y 这两个局部变量,所以以上述方式定义的宏将不会有副作用。
而在 ANSI C 中,对应的如下宏将会产生副作用:

#define min(x, y) ((x) < (y) ? (x) : (y))

代码 min(a++, b++) 会被展开为 ((a++) < (b++) ? (a++) : (b++)),传入宏的参数被增加了两次。

这里需要注意的是,代码行 (void) (&_x == &_y) 的作用是检查 _x 和 _y 的类型是否一致。

这条语句就执行程序来讲完全是一句废话,但是由于我们无法作这样的比较:typeof(_x) == typeof(_y),所以故意判断他们的地址是否相等。显然不可能相等,但是巧妙的是,如果在程序中 _x 和 _y 的类型不一样,对它们的地址进行比较,编译器在编译时就会抛出一个警告,借此我们可以对错误的代码进行修改。