内核宏定义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_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
typeof array#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。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。