C/C++中typedef关键字用法总结

首先介绍下typedef,它是一个关键字,可以理解为用于将数据类型起一个别名,但是与#define不同的是,typedef是编译期间由编译器进行处理的,而#define是一个预编译指令,是在预编译期由预处理器进行处理的。

typedef关键字有很多种用法,下面就对此进行总结下:

用于内置类型:

typedef int sizeArr;
void func(int* arrNum,sizeArr n){       //sizeArr == int

    for(int i=0;i<n;++i){
        std::cout << arrNum[i] << " ";
    }
}
一个典型的传递数组的函数,参数1接收一个数组首元素地址,参数2接收一个数组大小(元素个数),当然参数2可以用int n;代替,因为在这里sizeArr是int的别名,但是用int n;的话,可能用户在调用该函数的时候,就不是很清楚参数2接收什么东西的,而通过typedef定义一个别名,这样用户就能一目了然,知道参数2是接收一个数组大小的。

又如以下代码:

    typedef unsigned char BYTE;
    unsigned char Temp;          //#1
    BYTE Temp1;                  //#2
#1和#2的定义是等价的,当需要频繁定义unsigned char类型时,#2比#1定义方便很多,并且在代码中,可读性#2肯定也是比#1好的。另外通过typedef定义的别名,也增加了移植性,例如换了一个环境后,可能需要对代码中的所有int替换成long或其他类型,可能需要修改很多处,如果手动替换是非常费人力的,而且还可能出错。当通过typedef定义int别名后,代码中使用该别名,那么需要修改的时候,只需修改typedef定义的这一处即可。

另外当需要定义数个指针变量的时候,可能刚学C/C++不久的同学由于习惯性int a,b,c;这么定义多个变量,那么定义指针的时候可能也这么写:

    int* p1,p2;
实际上这是定义一个指向int类型的指针变量(p1)和一个int类型的变量(p2),p2并不是指针变量。

那么typedef可以这么定义:

typedef int* pNum;
pNum p1,p2;
将pNum作为int*的别名,该代码也就是定义了俩指针(p1和p2),非常方便。

用于结构体(struct):

struct Temp{
        int Num1;
        int Num2;
};
在C语言中,如果想定义一个结构体变量,那么必须这么定义:

struct Temp t1;
当代码中需要定义很多该结构体的话,可能就会比较麻烦,因为定义语句中必须包括struct Temp,如果使用typedef就会比较方便,看如下代码:

typedef struct Temp{
        int Num1;
        int Num2;
}TempNum;

TempNum t1;    //定义一个struct Temp结构体变量
这样每次定义该结构体的时候,只需用该结构体别名TempNum进行定义即可。

用于数组:

    char Str1[10];
    char Str2[10];
当需要定义多个char类型并且元素个数都相同的数组时,如果用如上代码分别定义的话,可能会比较麻烦,typedef依然可以解决该问题:

    typedef char STR[10];
    STR s1;
    STR s2;
这样就定义了俩元素个数都为10的char类型数组,是不是很方便呢?

用于函数指针:

假设有一个函数,他接收俩个函数指针:

void f1(int n){
    /*
    .........
    */
}

void f2(int n){
    /*
    .........
    */
}

void Func(void(*s1)(int),void(*s2)(int)){   //接收俩参数为int的并且返回类型为void的函数指针
    /*
    .........
    */
}
Func(f1,f2);
或者代码中有很多地方都需要定义一个参数为int并且返回void的函数指针变量,那么使用void(*s1)(int)形式定义一个该类型的函数指针变量(s1)将会很麻烦 ,如果使用typedef将会方便很多:

typedef void(*SS)(int);
void Func(SS s1,SS s2){
    /*
    .........
    */
}
该Func等价于上面的void Func(void(*s1)(int),void(*s2)(int));
以上就是对typedef的使用方法上进行了小小总结,便于以后进行查阅~

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值