关于一个宏定义引出的c语法思考

转载至   http://bbs.chinaunix.net/thread-2087578-1-1.html


内核中由以下代码:

#define container_of(ptr, type, member) ({ \

     const typeof( ((type *)0)->member ) *__mptr = (ptr); \ 

     (type *)( (char *)__mptr - offsetof(type,member) );})

这种定义中的临时变量的意义在于多了类型检查。


这是GCC的扩展
在GNU中, 通过在一个复合语句外加一对圆括号, 可以产生一个返回值. 如下面的表达式就返回8:

  1. ret = ({
  2.                 int a = 5;
  3.                 int b;
  4.                 b = a + 3;
  5.       });
复制代码

返回的值就是语句块中的最后一个语句的返回值.
这种结构在写宏的时候很有用. 比如
  1. #define even(x) (2*(x/2) == x ? x : x + 1)
复制代码

这是对x取整的. 如果在调用时使用even(i++)这种方式的话, 则会得出错误的结果. 
但是如果使用下面的方法:
  1. #define even(x)\
  2. ({\
  3.         int y = x;\
  4.         (2*(y/2) == y ? y:y+1);\
  5. })
复制代码

这样的话, 使用even(i++)也可以得到正确的结果.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值