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 的类型不一样,对它们的地址进行比较,编译器在编译时就会抛出一个警告,借此我们可以对错误的代码进行修改。
min宏小记
原创
©著作权归作者所有:来自51CTO博客作者魏巍的原创作品,请联系作者获取转载授权,否则将追究法律责任
上一篇:那个叫鲁迅的终于从教科书里消失了
下一篇:我的友情链接

提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
神奇的container_of宏
container_of宏的使用
container_of -
STP 小记
STP协议1.STP 生成树协议 可以实行冗余链路、防止广播风暴 2.STP算法 (1) 选择根网桥 &nbs
交换机 cisco 路由器 STP 生成树