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

时间:2019-06-03 23:44:51

标签: c gcc linux-kernel typeof

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


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

1 个答案:

答案 0 :(得分:6)

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

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