【C语言笔记】【linux宏定义系列】 编译时检查
linux宏定义系列内容。用于记录在linux kernel之中各式各样的宏定义☺。
宏定义说明
用于在编译时检查一个条件是否为真,如果条件为真则会编译失败,编译器报错,反之如果条件为假,则编译正常,且有返回值,返回 0。
该宏定义来自linux kernel 3.10。
实现代码
#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))
宏定义中:
e 表示要用于判断的条件表达式。
示例程序
条件为假时程序可以编译通过,且返回值为 0 。
int main(int argc, char* argv[])
{
printf("%zu\n", BUILD_BUG_ON_ZERO(0));
return 0;
}
运行后,结果为:
0
将条件更改为真:
int main(int argc, char* argv[])
{
printf("%zu\n", BUILD_BUG_ON_ZERO(1));
return 0;
}
则编译失败,提示
error: negative width in bit-field ‘<anonymous>’
错误: 位段‘<匿名>’宽度为负
对程序进行预处理得到展开后的宏:
int main(int argc, char* argv[])
{
printf("%zu\n", (sizeof(struct { int:-!!(1); })));
return 0;
}
实现过程
-
!!(e)
对条件
e
进行两次逻辑非运算,得到逻辑值结果 0 或者 1。如果表达式e
的结果为 0 ,则得到 0 , 如果为非 0 值,则得到 1 。 -
struct { int:-!!(e); }
如果表达式
e
的结果为 0,则得到结构体struct { int:0; }
,这是一个匿名的位域结构体,位域宽度为0。如果表达式
e
的结果为 1,则得到结构体struct { int:-1; }
,则编译错误。由于位域的宽度不能是负的,所以编译错误,提示错误error: negative width in bit-field ‘<anonymous>’
。 -
(sizeof(struct { int:-!!(e); }))
如果表达式
e
的结果为 0,则使用sizeof
运算符计算得到这个匿名结构体struct { int:0; }
的大小为 0,宏的返回值为 0。
[参考资料]
linux kernel 3.10
/include/linux/bug.h
本文链接:https://blog.csdn.net/u012028275/article/details/127478561