首页 > 代码库 > BUILD_BUG_ON 的解释

BUILD_BUG_ON 的解释

知乎上个问题《C 语言有什么奇技淫巧?》排名第一的是一个“抖机灵”的答案。

C有一个鲜为人知的运算符叫”趋向于”, 写作“-->”。比如说如果要实现一个倒数的程序,我们可以定义一个变量x,然后让它趋向与0:

 

其它答案也是蛮有意思的,有个和解答与它一样,可以看做"!!" 符号。

/* Force a compilation error if condition is true */#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))

 但它的确是两个!的叠加,有如下例子为证

#include <stdio.h>#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))int main(){   BUILD_BUG_ON(0!=0);   bool zero = false;   printf("%d\n", !!zero);   printf("%d\n", !zero);   return 0;}

 该结果输出 0 1

所以!符号的作用是将条件语句的bool值,转化为0 和1。

如果添加为真,则编译时报错

error: size of array is negative

 

但是这个编译时检查是有条件的,如果你写上

BUILD_BUG_ON(zero)

编译器无论如何也是无法检查的,因为变量的值是运行时。

 

在网上搜索了下,还有用用位域来强制编译器检查的,也是可以做借鉴的。

#define BUILD_BUG_ON_ZERO(e)  (sizeof(struct{int : -!!(e);}))#define BUILD_BUG_ON_NULL(e)  ((void*)sizeof(struct{int : -!!(e);}))#define BUILD_BUG_ON(condition)  ((void)BUILD_BUG_ON_ZERO(condition))#define MAYBE_BUILD_BUG_ON(condition)  ((void)sizeof(char[1 - 2 * !!(condition)]))

 

BUILD_BUG_ON 的解释