C语言宏定义里,用小括号中加花括号括起来的代码块,这种形式的宏定义理解不了 15
在Linux内核源代码中看到这么一个宏:/***container_of-castamemberofastructureouttothecontainingstructu...
在Linux内核源代码中看到这么一个宏:
/**
* container_of - cast a member of a structure out to the containing structure
* @ptr:the pointer to the member.
* @type:the type of the container struct this is embedded in.
* @member:the name of the member within the struct.
*
*/
#define container_of(ptr, type, member) ({\
const typeof( ((type *)0)->member ) *__mptr = (ptr);\
(type *)( (char *)__mptr - offsetof(type,member) );})
宏里面的语句的执行原理我大致明白,但是不明白的是,这个宏定义里用小括号(),将花括号{}代码块括起来,而花括号内有两条语句,宏是怎么知道要将第2条语句的结果返回的呢? 展开
/**
* container_of - cast a member of a structure out to the containing structure
* @ptr:the pointer to the member.
* @type:the type of the container struct this is embedded in.
* @member:the name of the member within the struct.
*
*/
#define container_of(ptr, type, member) ({\
const typeof( ((type *)0)->member ) *__mptr = (ptr);\
(type *)( (char *)__mptr - offsetof(type,member) );})
宏里面的语句的执行原理我大致明白,但是不明白的是,这个宏定义里用小括号(),将花括号{}代码块括起来,而花括号内有两条语句,宏是怎么知道要将第2条语句的结果返回的呢? 展开
3个回答
展开全部
这种写法叫什么名字不清楚,好像是叫复合语句,作用就是和普通语句块一样,但是整个语句的值是最后一个表达式的值。
语法如下
({expression1; expression2; [...expression;]})
假设
int a = ({int b = 1; int c = 2; b + c;)}
此时a = 3。
语法如下
({expression1; expression2; [...expression;]})
假设
int a = ({int b = 1; int c = 2; b + c;)}
此时a = 3。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
相当于#define myfunc(x) ({x=x+10; x - 1;})
返回的就是x-1的结果
使用方法: aa = myfunc(bb) 或者 if (myfunc(bb))
返回的就是x-1的结果
使用方法: aa = myfunc(bb) 或者 if (myfunc(bb))
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询