typedef关键字的含义
typedef是C语言中一个关键字,作用是用来定义(重命名类型)
C语言为什么要存在typedef关键字?这关键字存在的意义是啥?
在C语言中的类型有2种(内建类型ADT,自定义类型UDT):
第一种是C语言编译器中特有的类型(char/int/double等)
第二种是用户自定义的类型,不是语言自带的是程序员自定义类型(数组类型,结构体类型,函数类型等)
在编程中有的时候使用的自定义类型太长了,用起来不方便。就用到typedef进行重命名为一个短点名字。
typedef是给类型重命名的,也就是说typedef加工出来的都是类型,而不是变量。
typedef与#define宏的区别
#define dpChar char *
typedef char * tpChar —— 重命名类型
dpChar p1,p2; // 展开:char *p1,p2; char *p1;char p2;
tpChar p1,p2; // 等价:char *p1; char *p2;
注意:
当用#define去重命名变量类型时,只有p1定义为指针,而p2定义为char型变量。这是由于编译器在预处理阶段就会将代码中的dpChar地方原原本本的替换成char *,其他都不会改变。所以会出现两种定义不一样的现象。
typdef关键字不是在编译器预处理阶段替换的,他会在编译阶段以重命名类型的方式替换。
typedef与结构体
C语言中typedef与结构体结合使用是最常见的。这里列举几种常见的typdef重命名方式以及定义、赋值、使用的过程。
// 重命名
typedef struct
{
float fTemperature;
uint8_t ucHumidity;
void (*Measure_Period_Mode)(void);
}SHT30_t;
// 方式一 定义并赋值
SHT30_t SHT30 =
{
0.0,
0,
Measure_Period_Mode
};
// 方式二 定义并赋值
SHT30_t SHT30; // 结构体变量
SHT30.fTemperature = 0.0;
SHT30.ucHumidity = 0;
SHT30.Measure_Period_Mode = Measure_Period_Mode;
// 方式三 定义并赋值
SHT30_t *SHT30; // 结构体指针
SHT30->fTemperature = 0.0;
SHT30->ucHumidity = 0;
SHT30->Measure_Period_Mode = Measure_Period_Mode;
// 在重命名结构体时,命名了两种:SHT30_t结构体类型,*pSHT30_t结构体指针类型
typedef struct
{
float fTemperature;
uint8_t ucHumidity;
void (*Measure_Period_Mode)(void);
}SHT30_t,*pSHT30_t;
// 使用结构体指针类型定义
pSHT30_t = &SHT30;
typedef与const结合
typede int* PINT; const PINT p2; // 相当于int *const p2
typede int* PINT; PINT const p2; // 相当于int *const p2
typede const int* PINT; PINT p2; // 相当于const int * p2
注意:
typedef和const结合的时候第一种和第二种方式使用的方式,const修饰的都是p2指针。只有第三种方式const才能修饰p2指针所指向的那个内存值。
使用typedef的意义
1、简化类型的描述,尤其在函数指针中的使用
2、在很多编程体系下,人们倾向于不使用Int、double等C语言内建类型,因为这些类型本身和平台有关的。(如int在32位和64位中位数是不一样的)为了解决问题,很多程序使用自定义中间类型来缓冲使用。这样在将32位中的程序移植到64位的系统中时,只要更改重定义就完美解决问题。特别是在linux复杂程序中使用很广。