设置类型别名typedef
一、设置类型别名的格式
所谓设置类型别名,就是给数据类型起一个新的名字,就像给人起“绰号”一样。
typedef
是赋予现有类型一个新的名字,而不是创建新的类型。为了“见名知意”,请尽量使用含义明确的标识符,并且尽量大写。
设置类型别名的格式为:
typedef 原类型 新类型名;
1.给普通类型设置别名
typedef int DATATYPE;
DATATYPE a;
它等价于
int a;
2.给结构体类型设置别名
例如有一个结构体的名字是stu,要想定义一个结构体变量就得这样写:
struct stu stu1;
struct看起来就是多余的,如果为struct stu起一个别名STU,书写起来就简单多了。这种写法更加简练,意义也非常明确,不管在标准头文件还是以后的编程实践中,都会大量使用这种别名。
typedef struct stu STU;
STU stu1;
3.给数组类型设置别名
typedef char ARRAY20[20];
表示ARRAY20是类型char[20]的别名,它是一个长度为20的字符数组类型,接着可以用ARRAY20定义数组:
ARRAY20 a1,a2,a3,a4;
它等价于
char a1[20], a2[20], a1[20], a2[20];
4.给指针类型设置别名
int *a;
等价于
typedef int *STRING;
STRING a;
5.给数组指针类型设置别名
typedef int (*PTR_TO_ARR)[4];
表示 PTR_TO_ARR 是类型int (*) [4]的别名,它是一个二维数组指针类型。接着可以使用 PTR_TO_ARR 定义二维数组指针:
PTR_TO_ARR p1, p2;
6.给函数指针类型设置别名
typedef int (*MyFUN)(int a,int b);
int Max(int a,int b);
MyFUN pMyFun;
pMyFun= Max;
设置类型别名之后,新类型名具有与原类型名相同的数据类型,用户可以随意选择使用新类型名和原类型名,效果是一样的,那设置类型别名有什么好处呢?起别名的目的不是为了提高程序运行效率,而是为了编码方便。
二、设置类型别名的好处
1.简化长类型名
C语言中,有些数据类型的名字比较长,很容易造成书写错误。若给这样的数据类型设置一个简短的别名,就能减少书写上的错误。
例如
typedef unsigned int uint;
通过typedef给unsigned int类型设置一个简短的别名uint,后面的代码中需要使用unsigned int的地方,可以使用uint,是不是方便多了呢,类型别名的字符少了,书写自然就会减少。
2.便于代码维护(平台无关性) —— 重要
例如我们给short类型设置一个别名“DATATYPE”,在代码中都使用这个别名:
typedef short DATATYPE;
过了一段时间后,发现short类型太小了,不够用,想换大的类型int,那么只需改动设置类型别名的地方:
typedef int DATATYPE;
现在代码中所有的DATATYPE都表示为int类型了。是不是很方便?若是没有设置类型别名的地方,就得到代码中一一查找要修改的地方,对于代码量大的程序来说工程量很大。
3.扩展类型信息
在保存某人的基本信息的代码中,如果看到一个int类型的变量,怎么能知道这个变量所表示的是什么呢?是人的身高、体重还是年龄?这时可以给int类型设置类型别名:
typedef int age;
在代码中,变量类型使用age,这样一下子就能明白这个变量保存的是一个人的年龄。
三、typedef与#define的区别
#define
(宏定义)是预处理指令,只是简单的字符串代换(原地扩展),它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了。在预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错。
typede
f在编译时处理的。它在自己的作用域内给一个已经存在的类型一个别名,是为了增加可读性而为标识符另起的新名称(仅仅只是个别名),它的新名字具有一定的封装性,以致于新命名的标识符具有更易定义变量的功能,它是C语言编译过程的一部分,但它并不实际分配内存空间。
一般都遵循
#define
定义“可读”的常量以及一些宏语句的任务,而typedef
则常用来定义关键字、冗长的类型的别名。
typedef
是语句( 以;
结尾),而#define
不是语句( 不以;
结尾)