• linux内核宏container_of前期准备之gcc扩展关键字typeof


    • typeof基本介绍  

     1 typeof(x) 

      这是它的使用方法,x可以是数据类型或者表达式。它的作用时期和sizeof类似,就是它是在编译器从高级语言(如C语言)翻译成汇编语言时起作用,这个很重要,稍后会解释。

      当x是数据类型时,它和关键字typedef很相似,只不过typedef是要先定义再使用,而typeof则是可立即使用的,如下:

    1 typedef int INT;
    2 int main(int argc, const char *argv[])
    3 {
    4     INT a;
    5     typeof(int) b;
    6     
    7     return 0;
    8 }

      当x是表达式时:

    //变量
    int a;
    typeof(a)b;
     
    //数组
    int c[10];
    typeof(c) d;//相当于int d[10];因为c的类型是int *[10]
     
    //函数
    int foo(void)
    {
        return 0;           
    }
     
    typeof(foo) c;//foo函数指针类型 int (*)(void)
    typeof(foo()) d; //foo函数返回类型 int

      typeof(foo()) d;这句并不会导致函数foo被调用,上面有讲到它的作用时期和sizeof一样,它仅仅是获得x的数据类型,比如对于sizeof:

    int a[10];
    char len;
    
    len = sizeof(a);

      在编译器将源码由高级语言转到汇编语言时,sizeof关键字就其到了作用。我们甚至可以认为有点类似宏替换(注意发生的阶段不同),相当于是:

    int a[10];
    char len;
    
    len = 40;

      这一切发生在汇编阶段,typeof也是类似的作用原理,这也就是为什么foo()为什么并没被调用的原因。

    • typeof使用需要注意的问题

      1.typeof构造中的类型名不能包含存储类说明符,如extern或static。不过允许包含类型限定符,如const或volatile。

    1 static int a = 5;
    2 typeof(a)b; //编译没问题,等于int b;
    3 typeof(static int) b; //编译报错
    4 
    5 
    6 const int a = 2;
    7 typeof(a)b = 5;//等同于 const int 5;

       我的个人理解是extern和static的限定只是影响至链接阶段,而const和volatile影响直至执行阶段。好像并不怎么合理,暂时就记录下来吧。

      2.比较容易忽略的一点,通常:

    1 int *a,b;    //原意是定义2个int *的变量a,b。初学者容易犯的错误
    2 
    3 //实际要用
    4 int *a, *b;
    5 
    6 //但是typeof关键字不是这样的
    7 int *a;
    8 typeof(a)b,c; //它就是int *b, *c的意思,它不是简单的宏替换,特别要注意
    • 为什么要用typeof,或者说typeof的使用带来了什么好处

      回想我们交换2个变量的方法,最先想到的是利用第三个变量作为中间变量。

    1 void swap(int a,int b)
    2 {
    3     int tmp;
    4    
    5     tmp = b;
    6     b = a;
    7     a = tmp;              
    8 }

      如果我要交换的是2个char型变量呢?那岂不是又要写一个函数,太麻烦了。那么强大的typeof来了

    #define SWAP(a, b)  {
          typeof(a) _t=a;
          a=b;
          b=_t;}

       一个宏搞定所有基本类型数据交换,甚至是构造类型。妈妈再也不用担心我写到手抽筋了。

    参考:

      http://module77.is-programmer.com/posts/22102.html

      http://gcc.gnu.org/onlinedocs/gcc/Typeof.html

  • 相关阅读:
    米洛个人修炼术:导致上班累成狗的三大主因
    米洛个人修炼术:如何倍增你的功力修行速度达成健康体魄
    米洛个人修炼术:注意这三方面,天天都早起
    米洛个人修炼术:情绪的四种常用处理方式,其实都是有问题的
    好公司和差公司的对比
    课程作业二
    课程作业一
    作业四
    寒假作业三
    寒假作业二
  • 原文地址:https://www.cnblogs.com/thammer/p/4490806.html
Copyright © 2020-2023  润新知