- 论坛徽章:
- 0
|
原帖由 hijohnny 于 2007-12-19 12:53 发表 ![]()
这个宏定义,功能我知道,但就是它的语法格式和C的感觉有点不同(难道是GUN c的规范?),有谁懂的给讲解一下,谢谢
#define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__m ...
这是GCC的扩展
在GNU中, 通过在一个复合语句外加一对圆括号, 可以产生一个返回值. 如下面的表达式就返回8:
- ret = ({
- int a = 5;
- int b;
- b = a + 3;
- });
复制代码
返回的值就是语句块中的最后一个语句的返回值.
这种结构在写宏的时候很有用. 比如
- #define even(x) (2*(x/2) == x ? x : x + 1)
复制代码
这是对x取整的. 如果在调用时使用even(i++)这种方式的话, 则会得出错误的结果.
但是如果使用下面的方法:
- #define even(x)\
- ({\
- int y = x;\
- (2*(y/2) == y ? y:y+1);\
- })
复制代码
这样的话, 使用even(i++)也可以得到正确的结果. |
评分
-
查看全部评分
|