c语言程序如何获得warning信息(嵌入式C语言中typeof与container)

在嵌入式中,一般涉及到Linux内核代码的时候,会遇到typeof(注意不是typedef)和container_of,本文使用代码方式介绍typeof关键字和container_of宏。

一、typeof“关键字”

在ANSI C标准中定义了sizeof关键字用于获取变量和数据类型在内存中所占的字节数。GNU C中又扩展了typeof“关键字”,用于获取变量或表达式的类型。typeof是gcc标准,目前尚未纳入C标准。如下,代码使用介绍:

c语言程序如何获得warning信息(嵌入式C语言中typeof与container)(1)

(typeof代码)

c语言程序如何获得warning信息(嵌入式C语言中typeof与container)(2)

(gcc编译运行)

由此可知,通过typeof获取变量的类型后,可以使用该类型再定义一个变量。

typeof(m) n = 6相当于

int n = 6;

如此看来,typeof并没有什么新奇的?但如果配合下面的container_of宏,效果就显著多了。

二、container_of宏

有了typeof的基础,直接在查看该宏的真面目:

c语言程序如何获得warning信息(嵌入式C语言中typeof与container)(3)

container_of的定义

上述就是该宏的真面目,可以说设计的相当巧夺天工。这个宏的主要作用:根据结构体某一成员的地址,获取这个结构体的首地址。该宏需要三个元素:ptr为结构体成员member的地址,member为结构体的成员,type为结构体类型。

上述描述比较干涩,直接上代码调试(使用自定义的CONTAINER_OF):

c语言程序如何获得warning信息(嵌入式C语言中typeof与container)(4)

container_of代码示例

c语言程序如何获得warning信息(嵌入式C语言中typeof与container)(5)

container_of运行

从上述看,仅需要知道原结构体的一个成员team.number,可以推导原结构体的地址team,自然就可以获取该结构体其他成员的值。

实际使用的情况:假如传给某个函数的参数是某个结构体的成员变量,但是在这个函数中可能还需要使用到该结构体的其他成员变量,那么这时候使用container_of就非常方便。

一个结构体数据类型,在相同编译环境下,各个成员相对于结构体首地址的偏移是固定不变的。即当结构体的首地址为0时,结构体中各个成员的地址在数值上等于结构体成员相对于结构体首地址的偏移。

仔细分析:

#define OFFSET_OF(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)。结构体类型TYPE和结构体TYPE的成员MEMBER,将0强制转化为一个指向TYPE类型的结构体常量,然后通过这个常量指针房屋成员,获取MEMBER的地址,它的大小在数值上等于MEMBER成员在结构体TYPE中的偏移。

如何获取ptr指针类型,即通过(typeof的使用):

typeof( ((type *)0)->member ) *__mptr = (ptr)方式获取。

至此,typeof与container_of的基本介绍完毕。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页