And*_*nga 3 c gcc typeof linux-kernel
今天,我在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)); \
} \
)
Run Code Online (Sandbox Code Playgroud)
现在,我了解了宏的用途,并且以某种方式利用了“语句表达式”(下面的链接对此进行了提及)。我不明白的是((typeof(x))-1) > 0
什么有用。从gcc文档中的此链接,我想我了解该typeof
扩展名的含义。但是知道这一点似乎并不能回答在此宏中如何使用它。从我自己的实验,(typeof(x)-1)
似乎不评价比其他任何东西-1
,因此不这样始终会是小于 0(即假为三元的前两个部分)?
如果已经回答了这个问题,请指出。我确实进行了搜索,但是我的尝试没有返回特定于此用法的结果。
它没有使用(typeof(x)-1)
-它使用((typeof(x))-1)
的是形式(type)value
,即它是一个强制转换表达式。
它将值-1
转换为与expression相同的类型x
,然后测试结果是否大于零。如果x
具有带符号的整数类型或浮点类型,则结果为false;如果x
具有带符号的整数类型或浮点类型,则结果为true;对于其他大多数类型,该行为将是不确定的。