c - GCC typeof 扩展和 typeof 结果的数学运算

标签 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 是如何产生任何有用的东西的。来自 this link在 gcc 文档中,我想我了解如何使用 typeof 扩展。但是知道这一点似乎并不能回答它在这个宏中的使用方式。根据我自己的实验,(typeof(x)-1) 似乎不会评估除 -1 之外的任何内容,所以这不是总是小于 0(即三元组的前两部分为 false)?


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

最佳答案

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

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

关于c - GCC typeof 扩展和 typeof 结果的数学运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56435776/

相关文章:

c - C union 的命名标准

c - 双指针c内存故障

gcc - 为什么 GCC 在分配一个没有后续函数调用的大数组时将错误的值减去堆栈指针?

windows - OS线程调度与cpu使用关系

c - 如何在没有内核源代码树的情况下构建外部内核模块

c - 将成员地址分配给结构中的其他成员

c - 生成一个介于 0 和 4 之间且不包括一个数字的数字

c++ - 为什么 gcc 没有从多目标函数中捕获异常?

c++ - 关于静态模板化 constexpr 的 Clang 警告(未定义内联函数)

Linux内核调度程序变量 "vruntime"