zoukankan      html  css  js  c++  java
  • (void) (&_min1 == &_min2);【转】

    本文转载自:https://blog.csdn.net/xiaofeng_yan/article/details/5248693

    偶然在<./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了。 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/shoui/archive/2010/01/10/5169225.aspx

    那么为什么(void) (&_min1 == &_min2); 会使编译器报出警告呢?这就是指针的类型的问题:

    比如:

    int main ()
    {

        int *p1;
        char *p2;

        int a = 10;
        char b = 20;

        p1 = &a;
        p2 = &b;

     
        p1 == p2;
        return 0;
    }

     

     编译上述代码时编译器会给出警告:comparison of distinct pointer types lacks a cast 。“==”是比较的意思。也就是指针的类型不同是不能相互比较的。因为指针p1它指向含有4个字节连续的首地址,而指针p2 它指向含有1个字节的地址。

     

  • 相关阅读:
    阅读笔记十四
    惨淡的蓝桥杯国赛经历
    阅读笔记十三
    阅读笔记十二
    阅读笔记十一
    阅读笔记十
    阅读笔记九
    阅读笔记八
    阅读笔记七
    阅读笔记六
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/10623585.html
Copyright © 2011-2022 走看看