1、 typedef 修饰简单的数据类型
例如:int,float,double,string,vector可以理解为只是换了一个=====别名========
2、 typedef修饰指针或者数组
例如:typedef char line[81]; line test;//则test是一个81维的数组
另外一个要着重强调的就是typedef定义的指针,无论const在定义的名字的前后,表示的都是一个指针常量(不可修改
的指针),因此在使用const修饰typedef定义的指针的时候,尽量放在后面,不要引起歧义;
即:const line test;和line const test;等价都表示指针不可修改;
因此要用typedef定义常量指针,使用typedef const char * cpstr; 的方法;
3、 typedef在代码简化中的重要作用
例如在定义vector的迭代器中的使用,以及函数指针的定义;
在这里重点描述一下函数指针:
typedef 行为有点像 #define 宏,用其实际类型替代同义字。不同点是 typedef 在===编译===时被解释,因此让编译器来应付超越
预处理器能力的文本替换。例如:
typedef int (*PF) (const char *, const char *);
来看一个可怕的定义: PF Register(PF pf);
这个还算正常,但是展开之后:int (*Register (int (*pf)(const char *, const char *)))(const char *, const char *);
即在定义一些复杂的结构的时候typedef不仅可以简化代码,还可以增加程序的可理解性;
4、 typedef是一种存储类型关键字
typedef和register,auto,extern,mutable,static一样是一个存储类型关键字,这说明了这样一个问题,即用typedef定义一个
类型的时候,=========不能再有其他的存储类型关键字================;这点值得注意!!!
另外的一些话题:
#define与typedef引申谈
1) #define宏定义有一个特别的长处:可以使用 #ifdef ,#ifndef等来进行逻辑判断,还可以使用#undef来取消定义。
2) typedef也有一个特别的长处:它符合范围规则,使用typedef定义的变量类型其作用范围限制在所定义的函数或者文件内(取决于此变量定义的位置),而宏定义则没 有这种特性。
定义复杂的声明:
下面是三个变量的声明,我想使用typdef分别给它们定义一个别名,请问该如何做?
>1:int *(*a[5])(int, char*); //拥有5个元素的函数指针数组,该函数指针以int和char*为参数,返回int*类型
>2:void (*b[10]) (void (*)()); //拥有10个元素的函数指针数组,该函数指针以参数为空返回为空的函数指针,返回类型是void
>3. doube(*)() (*pa)[9]; //拥有9个元素的函数指针数组,该函数指针参数为空,返回类型为double
答案与分析:
对复杂变量建立一个类型别名的方法很简单,你只要在传统的变量声明表达式里用类型名替代变量名,然后把关键字typedef加在该语句的开头就行了。
>1:int *(*a[5])(int, char*);
//pFun是我们建的一个类型别名
typedef int *(*pFun)(int, char*);
//使用定义的新类型来声明对象,等价于int* (*a[5])(int, char*);
pFun a[5];
>2:void (*b[10]) (void (*)());
//首先为上面表达式蓝色部分声明一个新类型
typedef void (*pFunParam)();
//整体声明一个新类型
typedef void (*pFun)(pFunParam);
//使用定义的新类型来声明对象,等价于void (*b[10]) (void (*)());
pFun b[10];
>3. doube(*)() (*pa)[9];
//首先为上面表达式蓝色部分声明一个新类型
typedef double(*pFun)();
//整体声明一个新类型
typedef pFun (*pFunParam)[9];
//使用定义的新类型来声明对象,等价于doube(*)() (*pa)[9];
pFunParam pa;