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编译器来编译即可使用。)
ab 是同一种数据类型时,此函数返回 1
ab 是不同的数据类型时,此函数返回 0

下面再来分析 2 中的 __same_type((a), &(a)[0])

  • 1、若 a 是指针类型,&(a)[0] 仍然是指针类型。 __same_type 返回 1
  • 2、若 a 是数组类型,&(a)[0] 是指针类型。 __same_type 返回 0
Logo

更多推荐