typedef,看名称,就是类型定义,它,真的就用在类型定义。
它创建一种新的数据类型名称。
注意,是数据类型名称,不是数据类型。
也就是说,typedef并不创建新的类型,typedef只是在已有数据类型(比如 int,char等)上,给这个已有类型起一个别名。
typedef 应用场景:
1. 变量:
typedef int Length; // 给int数据类型创建一个名称,叫Length;
Length len, maxlen; // 可以用Length代替int,声明变量,声明的变量,数据类型就是int.
// 这个声明,等同于 int len, maxlen;
2. 指针:
typedef char *String; // 给char *这个指针类型创建一个名称,叫String
String rich = "I am a rich man!"; // 等同于 char *rich = "I am a rich man!";
3. 结构体:
// 包含结构体stRect声明,
// 和typedef结构体类型stRect一个新的名称 Rect
typedef struct stRect
{
int x;
int y;
int width;
int height;
}Rect;
Rect size; // 等同于struct stRect size;
或者
struct stRect
{
int x;
int y;
int width;
int heigth;
}; // 先声明一个结构体
typedef sturct stRect Rect; // 再用typedef生成一个名称 Rect;
Rect size; // 等同于 struct stRect size;
4. 函数指针。
void (*pf1)(int);
void (*pf2)(int);
void (*pf3)(int);
声明三个函数指针,
这三个函数指针可以用来指向一个无返回值(void),有一个int参数的函数;
每次声明函数指针,都差不多要跟声明函数原型一样了,敲这个多字符,好累好烦怎么办?
typedef void (*pFUNC)(int); // 给"无返回值,有一个int参数的函数指针"类型生成一个新名称,叫pFUNC;
pFUNC pf1, pf2, pf3, pf4; // 比 void (*pf1)(int)..这种轻松多了吧?
或者
typedef void FUNC(int); // 给"无返回值,有一个int参数的函数"类型生成一个新名称,叫FUNC;
FUNC *pf1. *pf2. *pf3, *pf4; // 既然类型是 FUNC,那指针,便是 FUNC *;
TIPS:
typedef 能否用 #define 来代替?比如 typedef int Length,可否替换成 #define Length int?
某些应用场合上是可以的,比如 typedef int Length,替换成 #define Length int,完全没有问题;
但它俩是完全不同的概念
#define 是预处理指令,只是简单地做字符串替换,不做类型检查;
#define Length int在预处理时把相关的Length字符串替换成int;
#define Length intxxxxxaabb,不进行变量声明(Length aa),编译也是能通过的。
typedef 是关键字,在编译时处理,做类型检查。
typedef int Length后,Length 就是一种类型,这种类型跟int一样。
typedef intxxxaaaba Length,不管进不进行变量声明,是无法通过编译的。
typedef 的作用:
1. 提高程序的可移植性,方便程序在不同平台上移植。
比如,定义一个变量,其值范围是0~0xABCDEF13;
在 32 位机上开发程序时,使用 unsigned int var(32位机unsigned int是32位,范围0~0xFFFFFFFF) ,符合!如果要把写好的程序移植到 16 位机上时,unsigned int var长度是16位,范围0~65535,不符合,怎么办呢?
如果不使用typedef,就需要把程序里所有用unsigned int 声明的变量,全部变成 unsigned long。
如果使用 typedef,只需要 typedef unsigned int DWORD;在声明变量时,使用 WORD var;如果需要把程序移植到16位机上时,只需要更改一个 typedef unsigned long DWORD 就行了。
2. 提高程序的可读性
为变量或者结构体,创建一个看起来一目了然的类型名称,让人一眼就知道这个类型是做什么的。