【发布时间】:2019-10-19 12:07:45
【问题描述】:
今天我在 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 有什么用处。从 gcc 文档中的 this link 开始,我想我了解了如何使用 typeof 扩展名。但是知道这一点似乎并不能回答它在这个宏中是如何使用的。根据我自己的实验,(typeof(x)-1) 似乎除了-1 之外没有任何评估结果,所以这总是会小于 0(即 false对于三元的前两部分)?
如果已经回答了,请指点我。我进行了搜索,但我的尝试没有返回特定于此用法的结果。
【问题讨论】:
-
我怀疑它正在测试类型是否是无符号的。如果
typeof(x)是某个无符号整数类型,那么(((typeof(x))-1)是正数。
标签: c gcc linux-kernel typeof