typedef

作者: 小李不木 | 来源:发表于2019-06-10 12:53 被阅读0次

    typedef 的作用是给存在的类型起一个新的名称。

    使用场合有:

    1>:基本数据类型

    2>:指针

    3>:机构体

    4>:枚举

    5>:执行函数的指针

    例如:  typedef  int  myint;

    //  给int 起了一个新的名称 myint ;

        myint a = 20;

    上面这两行就等价于: int  a = 20;

    例如:  char  * name = "itcast ";

      typedef char * string ;

    string name = " itcast ";

    上面这两句也是等价的。

    例如:

    struct  person 

    {

      int  age ;

      int no ;

    };

    struct person a = {20,2};

    就相当于:  typedef  struct person  p;

      p a = {20,2};

    也可以这样写:

    typedef  struct  person 

    {

      int  age ;

      int no ;

    }  p;

    p a = {20,2};

    因为结构体有两种定义方式:

    struct   

    {

      int  age ;

      int no ;

    }  personal;

    personal.age = 20;

    personal.no = 2;

    替换为:

    tyoedef  struct 

    {

      int  age ;

      int no ;

    }  personal;

    personal a = {20,2}; 

    这种定义方式省略了 类型名称。也是可以的,但是此种情况下,只能用新起的这个名称personal 来定义新的结构体变量。不能在用  struct 类型名  变量名这种方式了。

    指向函数的指针:

    例如:

    int  sum (  int a ,int b)

    {  

    return  a+b;

    }

    int  (*p)  (int ,int );

    p = sum;

    //  定义了一个指向函数 sum 的指针 p .

    可以这样:

    typedef  int (*mypoint )  (int ,int);

    mypoint  p = sum ;

    typedef的语法规则其实很简单,一句话来说就是定义对象的语法前加关键字typedef,剩下的不变,原本定义的对象标识符换成类型标识符,对应语义从定义一个对象改成定义一个类型别名。typedef看起来复杂根本原因是对象定义的语法比较复杂,例如分隔符*和[]的用法。

    typedef struct node{

    datatype data;

    struct node *lchild,*rchild;

    } bintnode;

    对应的对象定义:

    struct node{

    datatype data;

    struct node *lchild,*rchild;

    }bintnode;

    去除bintnode来看就是一个类型struct node的完整描述。加上了bintnode来看,表示定义了一个struct node类型的对象bintnode。

    现在前面有typedef,因此这个bintnode不是对象名而是类型名。也就是定义了一个类型别名bitnode,实际上指的就是struct node这个完整类型。

    typedef定义的类型别名在作用域内和被定义的原类型语义上等价,都是表示同一个类型的名称。这里typedef之后bitnode可以和struct node互相代替(注意在C++中,如果同一命名空间内类型名和对象名没有重复,那么struct可以省略,struct node等价于node)。

    更复杂一点的:

    struct node{

    datatype data;

    struct node *lchild,*rchild;

    }bintnode, *bintree;

    注意定义对象时*修饰对象本身而不是修饰类型。因此这里定义了struct node对象bintnode和struct node*类型的对象bintree。

    对应的类型定义:

    struct node{

    datatype data;

    struct node *lchild,*rchild;

    }bintnode, *bintree;

    这里定义了类型别名bintnode表示完整类型struct node,以及bintree表示类型struct node*。

    拆开来就成了

    typedef struct node{

    datatype data;

    struct node *lchild,*rchild;

    }bintnode;

    typedef bintnode *bintree;

    这种写法看起来应该稍微清楚了一点。

    至于下面的cirqueue,和上面的bintnode类似,只是这里省略了结构体名称,是一个匿名类型。这样写的主要好处是类型名可以省略struct

    枚举:

      enum  season

    {

      speing,

      summer,

      autumn ,

    winter

    } ;

    enum season a = spring ;

    可以替换为:

      typedef  enum  season

    {

      speing,

      summer,

      autumn ,

    winter

    }  myseason;

    myseason a = spring ;

    typedef  使用注意:

    某些时候可以和 # define 互换,因为宏定义实际是文本替换。而 typedef 是类型替换

    例如:

    # defined myint  int;

    myint a = 10;

    与 typedef  int  myint ;

      myint  a = 10;

    这几句代码是等价的 ,都相当于: int a = 10;

    但是有时候则不行,例如:

    1:typedef  char * str;

    str p1, p2;

    p1= "jack";

    p2 = "rose";

    2: #define str2  char * str;

    str2 p3, p4;

    //  相当于  char *  p3,p4;

    //  分别为: char * p3;

    //    char p4;

    宏定义只是文本替换 不是类型替换,所以只有p3是指针类型的。

    此时# define  和 typedef 两者是不能互换的。

    相关文章

      网友评论

          本文标题:typedef

          本文链接:https://www.haomeiwen.com/subject/ckfzxctx.html