本文带您学习3行短小精悍的Linux内核C语言代码,直接将您送上C语言高手的宝座,拿走不谢,我们一起好好学习C语言。先上代码:第一行:#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) #define container_of(ptr, type, member) ({ 第二行:const typeof( ((type *)0)->member ) *__mptr = (ptr); 第三行:(type *)( (char *)__mptr - offsetof(type,member) );}) 下面带您学习一下这三行代码:宏定义的结构,不仅可以单行,还可以多行,多行之间用 分隔。宏定义的参数,可以是type, member名称。0指针是可以被使用的,只要不写入就行,随便怎么读都可以,而且还很好用,天生适合用来计算地址偏移量。 定义宏的过程中要时刻注意给参数和结果外包一个()我们都知道(...)是一个表达式,但这个表达式里面竟然可以用{}和无数个;外加无数个 ,惊不惊喜?意不意外?完了还可以把它赋值给一个变量 void *p=(...); 。表达式 ({state1; state2; ...; staten; }) 的结果是staten的值。第二行的typeof(...)产生的结果竟然可以用来进行变量声明,而且还是个const,惊不惊喜?意不意外?谁说C语言不是动态语言?还有哪个语言支持用typeof(...) 声明变量?当变量名以__开头时,表示这是一个编译器使用的变量,用于和用户变量进行区分。如果想判断一个指针是否是某个类型,就用correct_type *__p=p_to_be_test; 这样的话,如果类型不一致,编译就不能通过,你学会了吗?如第三行所示,指针是可以加减的,当然,加减的时候要注意它的type,用char*就能保证加减的粒度是1