四个用途
用途一:类型的宏替换
在书写C++时,会遇到在一个语句中同时声明一个变量和指针的情况,如 char a, pb。
这样也不是不可,但对新手很不友好,二义性突出:pb和a都是char类型或只有a是指针。
typedef char* PCHAR
PCHAR pa, pb; // pa与pb都是指针
用途二:struct声明
下面的代码分别为不使用和使用typedef,显然后者更加方便。特别是大量使用struct时。
struct person {
int age;
bool male;
};
// 声明一个person
struct person p;
typedef struct person {
int age;
bool male;
} PERSON;
// 声明一个person
PERSON p;
用途三:统一替换类型
用typedef来定义与平台无关的类型。
// 在第一个平台上使用long double
typedef long double REAL;
// 但第二个平台不支持long double,直接更改宏不需要一一修改变量声名
typedef double REAL;
用途四:替换规则
为复杂的声明定义一个新的简单的别名。方法是:在原来的声明里逐步用别名替换一部分复杂声明,如此循环,把带变量名的部分留到最后替换,得到的就是原声明的最简化版。
// 原声明
int *(*a[5])(int, char*);
//变量名为a,直接用一个新别名pFun替换a就可以了:
typedef int *(*pFun)(int, char*);
//原声明的最简化版:
pFun a[5];
// 原声明
doube(*)() (*e)[9];
// 变量名为e,先替换左边部分,pFuny为别名一:
typedef double(*pFuny)();
// 再替换右边的变量e,pFunParamy为别名二
typedef pFuny (*pFunParamy)[9];
// 原声明的最简化版:
pFunParamy e;
两大陷阱
陷阱一
记住,typedef是定义了一种类型的新别名,不同于宏,它不是简单的字符串替换。比如:
先定义:
typedef char* PSTR;
然后:
int mystrcmp(const PSTR, const PSTR);
const PSTR实际上相当于const char吗?不是的,它实际上相当于char const。
原因在于const给予了整个指针本身以常量性,也就是形成了常量指针char* const。
简单来说,记住当const和typedef一起出现时,typedef不会是简单的字符串替换就行。
陷阱二
typedef在语法上是一个存储类的关键字(如auto、extern、mutable、static、register等一样),虽然它并不真正影响对象的存储特性,如:
typedef static int INT2; //不可行
编译将失败,会提示“指定了一个以上的存储类”。