该宏在Linux内核中实现的,可以在编译的时候检查传入参数的合法性,而assert是在运行到断言的时候才会知道参数的合法性。
原型
include/linux/kernel.h
/ Force a compilation error if condition is true /
define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
/ Force a compilation error if condition is true, but also produce a
result (of value 0 and type size_t), so the expression can be used
e.g. in a structure initializer (or where-ever else comma expressions
aren't permitted). /
define BUILD_BUG_ON_ZERO(e) (sizeof(char[1 - 2 * !!(e)]) - 1)
表达式sizeof(char[1 - 2!!(condition)])的作用,首先对条件表达式进行两次取反,这可以保证执行 1 - 2!!(condition) 的结果只有两种值:条件为0时结果为1或者不为0则结果为-1,显然char[-1]将会导致编译器报错。注意:两次取反的目的是为了将表达式的值转换为逻辑值。
BUILD_BUG_ON:只有条件condition为0时可编译,但不返回值,否则编译器报错。
BUILD_BUG_ON_ZERO:只有条件e为0时返回0,否则编译器报错。
当我们调试完代码后,建议关闭这个宏,可以使用另一个宏定义来使能/关闭BUILD_BUG_ON 宏。