1、前言 今天在看代码时,遇到offsetof和container_of两个宏,觉得很有意思,功能很强大。offsetof是用来判断结构体中成员的偏移位置,container_of宏用来根据成员的地址来获取结构体的地址。两个宏设计的很巧妙,值得学习。linux内核中有着两个宏的定义,并在链表 ...
前言 今天在看代码时,遇到offsetof和container of两个宏,觉得很有意思,功能很强大。offsetof是用来判断结构体中成员的偏移位置,container of宏用来根据成员的地址来获取结构体的地址。两个宏设计的很巧妙,值得学习。linux内核中有着两个宏的定义,并在链表结构中得到应用。不得不提一下linux内核中的链表,设计的如此之妙,只需要两个指针就搞定了。后续认真研究一下这 ...
2013-12-12 23:53 7 17873 推荐指数:
1、前言 今天在看代码时,遇到offsetof和container_of两个宏,觉得很有意思,功能很强大。offsetof是用来判断结构体中成员的偏移位置,container_of宏用来根据成员的地址来获取结构体的地址。两个宏设计的很巧妙,值得学习。linux内核中有着两个宏的定义,并在链表 ...
最近在学习c语言宏编程,看到了container_of宏,深入学习了一天,做个笔记留念。 1、看一下书上写的container_of的版本: 2、举一个实例: 替换后的结果: 如果替换后的结果你还能看懂,说明你是真明白了,呵呵,有没有兴趣自己写一遍 ...
1、c语言的结构体中,因为字节对齐的问题,导致成员地址并不能根据类型的大小进行计算。例如: 2、offsetof宏的实现如下: 哈哈,复杂吧,解释一下:由于造成空洞的对齐动作是由编译器负责完成的,这里有一个欺骗编译器的指令:((TYPE *)0), 意思是定义一个 ...
View Code (一).分析下宏定义1: #define offset_of(type,member) ((int)&(((type *)0)->member)) (type * )0 :强制把0地址转化为type *类型 ...
#define container_of(ptr, type, member) 输入: 结构体一个成员的member地址ptr, 结构体的类型, 结构体一个成员member的名, 输出: 得到这个结构体变量的地址; 分析: 结构体类型是确定的,结构体成员 相对 结构体定义的起始地址 偏移 ...
1、#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE*)0)->MEMBER) (include/linux/stddef.h) 1.1 功能: 返回结构体TYPE中MEMBER成员相对于结构体首地址的偏移量,以字节为单位 ...
,还是在一开始就被一个小小的 offsetof 宏搞晕了。 offsetof 宏 先来看看offsetof宏是 ...
今天总结一下宏和函数的区别,还有各自的优缺点。 宏在预处理阶段会被编译器替换掉,而且宏一般只做简单的文本替换,编译器对其不做任何的语法检测。 宏定义时主要用于以下两方面: 1、简单文本或字符串的替换; 2、宏函数。 对于宏函数,我们可能比较陌生,下面举例来介绍一下宏函数 ...