本文介绍了什么是" - !!"在C code吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我碰上了这个陌生的宏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);}))


  1. (E):计算前pression 电子


  2. !!(E):从逻辑上否定了两次: 0 如果 Ë== 0 ;否则 1


  3. - !!(E):数控否定: 0 如果 Ë== 0 ;否则 1


  4. 结构{INT: - !!(0);} - >结构{INT:0;} :如果是零,那么我们宣布与具有宽度为零匿名整数位域的结构体。一切都很好,我们继续正常。


  5. 结构{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吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

05-27 17:50
查看更多