gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:05:17 26 4
gpt4 key购买 nike

今天我在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com