We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
这个宏非常常用,实现大多都是#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])),今天要用这个宏,怕写错了,看了下内核怎么写的,一下就看懵逼了。
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
内核的实现如下:
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
__must_be_array什么鬼
__must_be_array
#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
BUILD_BUG_ON_ZERO和__same_type又是什么鬼
BUILD_BUG_ON_ZERO
__same_type
#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); })) # define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
解析:
__builtin_types_compatible_p
BUILD_BUG_ON_ZERO(e)
总结:内核ARRAY_SIZE宏除了计算出数组大小外,还检查了参数是否是数组,如果不是数组编译直接报错。好强大,代码写错了,直接在编译的时候就检查出来了,而不是在运行时!!
ARRAY_SIZE
参考:Linux Kernel 代码艺术——编译时断言
The text was updated successfully, but these errors were encountered:
No branches or pull requests
内核ARRAY_SIZE实现
这个宏非常常用,实现大多都是
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
,今天要用这个宏,怕写错了,看了下内核怎么写的,一下就看懵逼了。内核的实现如下:
__must_be_array
什么鬼BUILD_BUG_ON_ZERO
和__same_type
又是什么鬼解析:
__same_type
__builtin_types_compatible_p
是gcc内置的函数,从名字看应该是判断两个变量的类型是否一样BUILD_BUG_ON_ZERO
这个就宏就值得一说了
总体而言,
BUILD_BUG_ON_ZERO(e)
这个宏的意思就是说,如果e不为0那么编译报错,如果e为0那么返回0。总结:内核
ARRAY_SIZE
宏除了计算出数组大小外,还检查了参数是否是数组,如果不是数组编译直接报错。好强大,代码写错了,直接在编译的时候就检查出来了,而不是在运行时!!参考:Linux Kernel 代码艺术——编译时断言
The text was updated successfully, but these errors were encountered: