gpt4 book ai didi

c - C语言中的 ':-!!'是什么?

转载 作者:行者123 更新时间:2023-11-30 17:56:27 25 4
gpt4 key购买 nike

我在 /usr/include/linux/kernel.h 中遇到了这个奇怪的宏代码:

/* Force a compilation error if condition is true, but also produce a
result (of value 0 and type size_t), so the expression can be used
e.g. in a structure initializer (or where-ever else comma expressions
aren't permitted). */
#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))
#define BUILD_BUG_ON_NULL(e) ((void *)sizeof(struct { int:-!!(e); }))

:-!! 是做什么的?

最佳答案

这实际上是一种检查表达式 e 是否可以计算为 0 的方法,如果不是,则构建失败

该宏的命名有些错误;它应该更像是 BUILD_BUG_OR_ZERO,而不是 ...ON_ZERO。 (已经有 occasional discussions about whether this is a confusing name 。)

您应该这样阅读该表达式:

sizeof(struct { int: -!!(e); }))
  1. (e):计算表达式e

  2. !!(e):逻辑取反两次:0 if e == 0;否则1

  3. -!!(e):如果是 0,则对步骤 2 中的表达式进行数值否定:0;否则-1

  4. struct{int: -!!(0);} --> struct{int: 0;}:如果它为零,那么我们声明一个带有匿名整数的结构体宽度为零的位域。一切都很好,我们一切正常。

  5. struct{int: -!!(1);} --> struct{int: -1;}:另一方面,如果不是 零,那么它将是某个负数。声明任何宽度为负的位域都是编译错误。

因此,我们要么得到一个结构体中宽度为 0 的位域(这很好),要么得到一个负宽度的位域(这是一个编译错误)。然后我们采用该字段的 sizeof ,这样我们就得到了具有适当宽度的 size_t (在 e 为零的情况下,该宽度为零) .

<小时/>

有些人问:为什么不直接使用断言

keithmo's answer这里有一个很好的回应:

These macros implement a compile-time test, while assert() is a run-time test.

完全正确。您不想在运行时检测内核中本来可以更早发现的问题!它是操作系统的关键部分。无论何种程度的问题都可以在编译时检测到,那就更好了。

关于c - C语言中的 ':-!!'是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13531286/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com