内核宏定义 ARRAY_SIZE
1、ARRAY_SIZE用来判断一个数组的 size,若传入的参数不是一个数组,编译将会报错。使用此宏来安全的获取一个数组的 size。include/linux/kernel.h#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))2、__must_be_arrayinclude/linux/
·
1、ARRAY_SIZE
用来判断一个数组的 size,若传入的参数不是一个数组,编译将会报错。
使用此宏来安全的获取一个数组的 size(注意是这个数组的元素个数,而不是字节数!!)。
include/linux/kernel.h
// sizeof接数组名,返回的就是这个数组所有元素所占据的字节数
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
2、__must_be_array
include/linux/compiler-gcc.h
/* &a[0] degrades to a pointer: a different type from an array */
#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
3、BUILD_BUG_ON_ZERO
注意在 !!(e)
是将 e
转换为一个 bool值(0或者1)。
当 e == 0
时,此宏在编译时能够通过。
当 e == 1
时,此宏在编译时不能通过(报错)。
include/linux/bug.h
#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))
4、__same_type
include/linux/compiler.h
#define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
__builtin_types_compatible_p
是gcc内联函数,当在内核源码中找不到定义也无需包含头文件,在应用程序代码中也可以直接使用这个函数。(似乎只要是用gcc编译器来编译即可使用。)
当 a
和 b
是同一种数据类型时,此函数返回 1
。
当 a
和 b
是不同的数据类型时,此函数返回 0
。
下面再来分析 2 中的 __same_type((a), &(a)[0])
:
- 1、若
a
是指针类型,&(a)[0]
仍然是指针类型。__same_type
返回1
。 - 2、若
a
是数组类型,&(a)[0]
是指针类型。__same_type
返回0
。
更多推荐
已为社区贡献1条内容
所有评论(0)