问题描述
我碰上了这个陌生的宏code在/usr/include/linux/kernel.h:
/ *强制编译错误,如果条件为真,还会产生
结果(值0和size_t类型),因此,可以使用前pression
例如在结构初始化(或在前所未有其他逗号前pressions
不允许)。 * /
#定义BUILD_BUG_ON_ZERO(E)(的sizeof(结构{INT: - !!(E);}))
#定义BUILD_BUG_ON_NULL(E)((无效*)的sizeof(结构{INT: - !!(E);}))
这是什么: - ?!!
做
这是,实际上,办法来检查前pressionË是否可以评价为0,如果没有,构建失败
宏是有些名不副实;它应该像 BUILD_BUG_OR_ZERO
,而不是 ... ON_ZERO
更多的东西。 (已经有 )
您应该阅读前pression是这样的:
的sizeof(结构{INT: - !!(E);}))
-
(E)
:计算前pression电子
-
!!(E)
:从逻辑上否定了两次:0
如果Ë== 0
;否则1
。 -
- !!(E)
:数控否定:0
如果Ë== 0
;否则1
。 -
结构{INT: - !!(0);} - >结构{INT:0;}
:如果是零,那么我们宣布与具有宽度为零匿名整数位域的结构体。一切都很好,我们继续正常。 -
结构{INT: - !!(1);} - >结构{INT:-1;}
:在另一方面,如果它的不是的零,那么这将是一些负数。声明任何位域的负的宽度为编译错误。
所以我们会以风与具有在结构宽度0位域,这是很好的,或负宽度,这是一个编译错误位域。然后我们采取的sizeof
的领域,使我们得到了一个为size_t
与适当的宽度(这将是零的情况下其中,电子
为零)。
有些人问:为什么不直接使用断言
具有良好的响应:
Exactly right. You don't want to detect problems in your kernel at runtime that could have been caught earlier! It's a critical piece of the operating system. To whatever extent problems can be detected at compile time, so much the better.
这篇关于什么是" - !!"在C code吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!