今天我在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(即三元组的前两个部分为假)?
如果已经回答了,请指出。我确实做了搜索,但是我的尝试没有返回特定于此用法的结果。
答案 0 :(得分:6)
它没有使用(typeof(x)-1)
-它正在使用((typeof(x))-1)
,其形式为(type)value
-即,它是一个强制转换表达式。
它将值-1
转换为与表达式x
相同的类型,然后测试结果是否大于零。如果x
具有带符号整数类型或浮点类型,则结果将为false;如果x
具有无符号整数类型,则结果将为true;对于大多数其他类型,其行为将是不确定的。