关于(void) (&_min1 == &_min2);

本文解析了Linux内核中一个复杂的min宏定义,该宏通过GCC扩展命令typeof()实现泛型最小值比较功能,并解释了其中(void)(&_min1==&_min2)这一行代码的作用,即防止不同类型的变量直接比较导致的编译警告。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

偶然在<./linux/include/linux/kernel.h>里面看到下面这个宏定义:

#define min(x, y)                                 /
({                                                /
    typeof(x) _min1 = (x);                        /
    typeof(y) _min2 = (y);                        /
    (void) (&_min1 == &_min2);                    /
    _min1 < _min2 ? _min1 : _min2;                /
})


这就是一个泛型宏。使用了GCC的扩展支持命令typeof() 。一共四行代码,其他都很明了,唯独第三行让人有点摸不着头脑。
我第一反应这是为了防止编译器优化代码结构而添加的语句。但是回头想了一下,没有想出理由来。也就没在意了。
 
今天一个很突然的机会才反应过来这么做的原因:为防止不同类型变量进行比较。

 

int main(int ac, char** av)
{
    char i = 100;
    long j = 1000;
    long k = min(i, j);

    return 0;
}


编译上述代码时编译器会给出警告:comparison of distinct pointer types lacks a cast
如果去掉(void) (&_min1 == &_min2) 这行,再编译是不会给出警告的。

这群写内核人太TMD牛X了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值