linux内核中一个特殊宏:BUILD_BUG_ON的分析
最近,在看linux内核源码的时候遇到了一个比较有意思的宏定义:BUILD_BUG_ON,如果去解刨这个宏,会发现里面使用到了位域的概念,而位域的概念使用到的概率不是很大,说白了我不是很熟悉,因此今天解刨一下这个有意思的宏:BUILD_BUG_ON。
#define BUILD_BUG_ON(condition) ((void)BUILD_BUG_ON_ZERO(condition)) #define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))从上面看到BUILD_BUG_ON()宏值为BUILD_BUG_ON_ZERO(),因此我们解析一下BUILD_BUG_ON_ZERO()这个宏,特别解刨一下宏值。
首先内部定义了一个结构体类型,成员只有一个,并且为int类型的,使用了“:”代表的位域,位域的意思就是指定多少bit位,必须为大于或等于0的数值,而后面-!!(e),这个的结果只能为0或1。
当e!=0时,例如3,结果为-1;int:-!!(e)的结果为int:-1,这种情况是不被gcc编译允许的,编译会报:"negative width in bit-field"(位域宽度为负)的错误。
当e==0时,结果为-0,也就是0;int:-!!(e)的结果为int:0,这种情况gcc编译是允许的。
因此这个宏BUILD_BUG_ON的作用:当e这个条件为0时,编译OK,继续编译;当e这个条件为真事,编译报错。
