GCC typeof扩展名和typeof结果的数学

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(即假为三元的前两个部分)?


如果已经回答了这个问题,请指出。我确实进行了搜索,但是我的尝试没有返回特定于此用法的结果。

caf*_*caf 6

它没有使用(typeof(x)-1)-它使用((typeof(x))-1)的是形式(type)value,即它是一个强制转换表达式。

它将值-1转换为与expression相同的类型x,然后测试结果是否大于零。如果x具有带符号的整数类型或浮点类型,则结果为false;如果x具有带符号的整数类型或浮点类型,则结果为true;对于其他大多数类型,该行为将是不确定的。