关于Typedef

来源:互联网 发布:汉朝 外戚 知乎 编辑:程序博客网 时间:2024/05/23 17:06

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;