linux tricks 之 FIELD_SIZEOF.

发布时间:2017-3-24 0:34:09 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"linux tricks 之 FIELD_SIZEOF. ",主要涉及到linux tricks 之 FIELD_SIZEOF. 方面的内容,对于linux tricks 之 FIELD_SIZEOF. 感兴趣的同学可以参考一下。

1 include/linux/kernel.h2 #define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f))

它通过对0指针灵活运用,是对sizeof的一种变相扩展。

2.ARRAY_SIZE获取数组维数

ARRAY_SIZE用来获取一维或者多维数组的第一维大小,并对非数组指针进行合法性检查。

 

1 include/linux/kernel.h2 #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))

 

它的思想很简单,就是通过sizeof获取整个数组大大小,然后除以单个数组元素的大小。__must_be_array用来检查arr参数是否为数组指针。在gcc中它被支持,其他编译器可能将它直接定义为0:

1 include/linux/kernel.h2 #define BUILD_BUG_ON_ZERO(e) (sizeof(char[1 - 2 * !!(e)]) - 1)3 4 include/linux/compiler-gcc.h5 #define __must_be_array(a) \6   BUILD_BUG_ON_ZERO(__builtin_types_compatible_p(typeof(a), typeof(&a[0])))

__builtin_types_compatible_p是gcc编译器的内嵌函数,它用于判断一个变量的类型是否为某指定的类型,假如是就返回1,否则返回0。这里通过判断指针和指针指向的第一个元素的指针是否是相同类型来判断是否为数组。BUILD_BUG_ON_ZERO的作用在于将返回值转化为编译错误信息。显然当内嵌函数返回值为0时,也即类型相同时,由于BUILD_BUG_ON_ZERO参数为非0而导致char[-1]而发出编译器警告。经过以上分析也很容易写出判断数组指针的宏,如果是返回1,否则返回0。

1 #define IS_ARRAY_PTR(p)    (!__builtin_types_compatible_p(typeof(p), typeof(&p[0])))

无论是ARRAY_SIZE还是扩展的IS_ARRAY_PTR宏,它们只接受明确的指针参数名,而无法接受&a这样的参数,这是由于宏的扩展引起的,报错信息如下:

1 xxx.c:17: error: subscripted value is neither array nor pointer

1.FIELD_SIZEOF获取成员大小

上一篇:[WPF] Wait for a moment.
下一篇:redis集群

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

好贷网好贷款