typedef 的作用是给已知的数据类型命名别名,因为有时使用别名更方便,语义更清晰。
1. 复杂的数据类型名称简化
typedef 的典型应用就是可以用一个较为简短的别名去表示一个复杂数据类型 。例如,如果程序需要一个如下形式的函数指针类型
void (*)(int, int);
并且程序中还需要定义较多这种类型的指针变量,那么每定义一个变量就写一遍这个类型,不仅麻烦而且还容易出错,所以关键字 typedef 为它定义一个简短的别名就会好得多,例如如下定义:
typedef void (*PFON)(int, int);
这样再定义一个void (*)(int, int)类型的函数指针变量function的语句便是:
PFON function;
显然,现在比原来清楚多了。
2.用typedef 定义与平台无关的数据类型
众所周知,不同的程序运行平台,它们所支持的数据类型会有少许区别,如果不采取措施,程序的跨平台应用就会很困难。
例如A平台64为数据类型为 long double,而B平台的64为数据类型为double,那么基于A平台开发的程序就不能在B平台运行。
对于上述问题,在程序设计时,凡是64为数据的定义都是用一个别名REAL表示,如果希望程序运行于A平台,则在程序代码之前作如下声明:
typedef long double REAL;
同理,如果希望程序运行于B平台,则在程序代码之前作如下声明:
typedef double REAL;
因此,当跨平台时,只需修改typedef本身就行,不需对其他源码做任何修改。
3.增强代码可读性
在程序设计中,经常会出现不同用途的数据属于同一种数据类型的情况,由于数据类型的标识不含有用途的信息,因此当程序规模特别大时,程序的可读性会变得非常差。此时最好为这种数据类型声明多个别名,而且在选择别名的标识时使之带有用途的信息。例如:
typedef int AGE; // 年龄
typedef int SIZE; // 尺寸
typedef int NUM; // 数量
typedef int WITH; // 宽度
typedef int FIGH; // 高度
4.避免错误
定义指针变量时要使用符号“*”,但这个符号可能会使人们产生误解。例如下面的定义:
int *pa, pb; // 定义一个整型指针,一个整型变量
int *pa, *pb; // 定义两个整型指针
可能会将定义两个整型指针写成第一种情况,为了避免上述问题的发生,使用typedef为int*这个类型定义一个别名。如下:
typedef int * PINT;
在这个定义之后,再定义两个整型指针就可以写成如下形式:
PINT pa, pb;