C语言基础篇 (十一)关键字 typedef
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复杂程序中使用很广。