# typedef关键字
typedef
关键字主要用于自定义数据类型名称,来替代系统默认的基本类型名称、数组类型名称、指针类型名称与用户自定义的结构型名称、共用型名称、枚举型名称等
# 几种用法
# 为基本数据类型定义新的类型名
typedef float aFloatValue;
/*如下两个定义变量的方式都可以*/
float float1 = 4.9;
aFloatValue float2 = 9.7;
1
2
3
4
2
3
4
# 为自定义数据类型(结构体、共用体和枚举类型)定义简洁的类型名称
// 原本的结构体
struct Point
{
double x;
double y;
double z;
};
struct Point stu1; // 创建结构体变量
// typedef 后
typedef struct Point
{
double x;
double y;
double z;
}tagPoint;
tagPoint stu2; // 使用结构体直接用自定义的 tagPoint
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
上面使用 typedef
的方法,其实相当于拆分成如下两个部分
struct Point
{
double x;
double y;
double z;
};
typedef struct Point tagPoint
1
2
3
4
5
6
7
2
3
4
5
6
7
加深理解
- 看一个报错的案例
typedef struct tagNode
{
char *pItem;
pNode pNext; // 错误
} *pNode;
1
2
3
4
5
2
3
4
5
报错原因是,pNode
表示的是该结构体的新别名。于是问题出现了,在结构体类型本身还没有建立完成的时候,编译器根本就不认识 pNode
,因为这个结构体类型的新别名还不存在,所以自然就会报错。
修改
typedef struct tagNode
{
char *pItem;
struct tagNode *pNext; // 创建一个结构体变量
} *pNode;
1
2
3
4
5
2
3
4
5
解释如下

当然,也可以先定义 *pNode
再使用
typedef struct tagNode *pNode;
strcut tagNode
{
char *pItem;
pNode pNext;
}
1
2
3
4
5
6
2
3
4
5
6
# 其他用法
数组、指针都可以使用 typedef
, 这里不再赘述。