【C语言笔记】【linux宏定义系列】 编译时检查 2
linux宏定义系列内容。用于记录在linux kernel之中各式各样的宏定义☺。
宏定义说明
用于在编译时检查一个条件是否为真,如果条件为真则会编译失败,编译器报错,反之如果条件为假,则编译正常。
这个宏定义没有返回值,如果需要返回值可以使用 BUILD_BUG_ON_ZERO.
该宏定义来自linux kernel 3.10。
实现代码
#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
宏定义中:
condition 表示要用于判断的条件表达式。
示例程序
条件为假时程序可以编译通过。
int main(int argc, char* argv[])
{
BUILD_BUG_ON(0);
return 0;
}
将条件更改为真:
int main(int argc, char* argv[])
{
BUILD_BUG_ON(1);
return 0;
}
则编译失败,提示
error: size of unnamed array is negative
错误: 无名数组的大小为负
最后看一下条件为假时,对程序进行预处理得到展开后的宏:
int main(int argc, char* argv[])
{
((void)sizeof(char[1 - 2*!!(0)]));
return 0;
}
实现过程
-
!!(condition)
对条件
condition
进行两次逻辑非运算,得到逻辑值结果 0 或者 1。如果表达式condition
的结果为 0 ,则得到 0 , 如果为非 0 值,则得到 1 。 -
char[1 - 2*!!(condition)]
如果表达式
condition
的结果为 0,则得到数组char[1]
,这是一个大小为1的无名数组。如果表达式
condition
的结果为 1,则得到数组char[-1]
,则编译错误。由于数组的大小不能是负的,所以编译错误,提示错误error: size of unnamed array is negative
,无名数组的大小为负。 -
((void)sizeof(char[1 - 2*!!(condition)]))
如果表达式
condition
的结果为 0,则使用sizeof
运算符计算得到这个无名数组char[1]
的大小为 1,但由于有(void)
的存在,这个宏是没有返回值的。如果没有
(void)
的存在,示例程序就会提示如下警告:warning: statement with no effect [-Wunused-value] 警告: 语句不起作用 [-Wunused-value]
所以
(void)
使得该宏定义既没有返回值又消除了未使用的警告。
[参考资料]
linux kernel 3.10
/include/linux/bug.h
本文链接:https://blog.csdn.net/u012028275/article/details/128996631