1. 先来介绍一下 typeof
typeof 是C语言的新扩展的一个东东,只有部分编译器支持,不过这个特性在linux内核中应用非常广泛.
typeof的参数可以是两种形式:表达式或类型。
type:
typeof(int *) a,b; 等价于 int *a,*b; 把y定义成x指向的数据类型:typeof(*x) y;
expression:
extern int foo(); typeof(foo()) var;
2. 在看一下#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
是获取TYPE类型中成员MEMBER的相对偏移量,如果基址为0,那么地址&((TYPE *)0)->MEMBER转换为size_t后就是此成员的偏移量了这里的0作为起始地址用,来计算偏移量,如果用其它数字代替offsetof得到的数值要减去这个数字才是真正的偏移量,所以这里用0是最佳的选择。
3. 可以看container_of macro 了
definition:
- #define container_of(ptr, type, member) ({ \
- const typeof( ((type *)0)->member ) *__mptr = (ptr); \
- (type *)( (char *)__mptr - offsetof(type,member) );})
example(http://hi.baidu.com/xiquanlian/blog/item/a070d658642ea482810a18e3.html):
- #include <linux/unistd.h>
- #include <linux/string.h>
- #include <linux/stdlib.h>
- #include <linux/kernel.h>
- struct cona_t{
- int i;
- int j;
- int v;
- char t[10];
- unsigned short xy;
- };
- struct cona_t ct;
- unsigned short xy;
- int main(int argc,char * argv[])
- {
- int xy;
- struct cona_t * p;
- memset(&ct,0,sizeof(struct cona_t));
- ct.i = ct.j = ct.v = 10;
- sprintf(ct.t,"%s","sdf");
- ct.xy = 20;
- p = container_of(&ct.xy,struct cona_t,xy);
-
- printf("%s\n",p->t);
- return 0;
- }
4. understand & over ....
阅读(1946) | 评论(0) | 转发(0) |