LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2558|回复: 5

container_of宏函数体里面为什么可以有分号?

[复制链接]
发表于 2009-9-27 20:27:55 | 显示全部楼层 |阅读模式
#define container_of(ptr, type, member) ({                        \
        const typeof( ((type *)0)->member ) *__mptr = (ptr);        \
        (type *)( (char *)__mptr - offsetof(type,member) );})
为什么这个函数里面为什么可以有分号?
为什么重新定义一个新变量 __mptr?
发表于 2009-9-27 22:20:31 | 显示全部楼层
函数里面当然可以有分号,这对C是很基础的知识。

重新定义变量的目的主要是做类型转换。这个估计算是 upcast。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-28 09:43:07 | 显示全部楼层
问题是它咋这样用呢?
#define list_entry(ptr, type, member )  container_of(ptr, type, member)

#define list_for_each_entry(pos, head, member)                                \
        for (pos = list_entry((head)->next, typeof(*pos), member);        \
             prefetch(pos->member.next), &pos->member != (head);         \
             pos = list_entry(pos->member.next, typeof(*pos), member))
里面的
pos = list_entry((head)->next, typeof(*pos), member)
展开之后就变成pos=({ \
const typeof( ((typeof(*pos) *)0)->member ) *__mptr = ((head)->next); \
(typeof(*pos)*)( (char *)__mptr - offsetof(typeof(*pos),member) );})
即 pos=({语句1;语句2;}),这样pos得到的值是啥呢?
回复 支持 反对

使用道具 举报

发表于 2009-9-28 12:49:42 | 显示全部楼层
neubuffalo 兄不理解的应该是 ({ })

({ }) 中可以包含多条语句, 就是说可以有多个分号, 并且它里面最后一个语句的结果就是这个表达式的结果
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-28 15:43:12 | 显示全部楼层
哦,明白了,谢谢。
Post by remote fish;2031147
neubuffalo 兄不理解的应该是 ({ })

({ }) 中可以包含多条语句, 就是说可以有多个分号, 并且它里面最后一个语句的结果就是这个表达式的结果
回复 支持 反对

使用道具 举报

发表于 2009-9-30 17:33:10 | 显示全部楼层
支持一下  







  www.starbabyhk.com/
星级宝贝母婴服务  赴港产子,香港生宝宝

Tel:86-0755-82823320  
Email :starbabyching@hotmail.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表