今天我在 Linux 内核中遇到了这个宏 (include/linux/kernel.h
)
#define DIV_ROUND_CLOSEST(x, divisor)( \
{ \
typeof(x) __x = x; \
typeof(divisor) __d = divisor; \
(((typeof(x))-1) > 0 || /* <-- why does this work */ \
((typeof(divisor))-1) > 0 || (__x) > 0) ? \
(((__x) + ((__d) / 2)) / (__d)) : \
(((__x) - ((__d) / 2)) / (__d)); \
} \
)
现在,我明白了宏的用途,它以某种方式利用了“语句表达式”(下面的链接提到了这一点)。我不明白的是 ((typeof(x))-1) > 0
是如何产生任何有用的东西的。来自 this link在 gcc 文档中,我想我了解如何使用 typeof
扩展。但是知道这一点似乎并不能回答它在这个宏中的使用方式。根据我自己的实验,(typeof(x)-1)
似乎不会评估除 -1
之外的任何内容,所以这不是总是 将小于 0(即三元组的前两部分为 false)?
如果这个问题已经得到解答,请指点我。我进行了搜索,但我的尝试没有返回特定于此用法的结果。
最佳答案
它没有使用 (typeof(x)-1)
- 它使用 ((typeof(x))-1)
,其形式为 (type)value
- 即,它是一个转换表达式。
它将值 -1
转换为与表达式 x
相同的类型,然后测试结果是否大于零。如果 x
具有带符号整数类型或浮点类型,则结果将为 false,如果 x
具有无符号整数类型,则结果将为 true,对于大多数其他类型,该行为将为未定义。
关于c - GCC typeof 扩展和 typeof 结果的数学运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56435776/