typedef关键字
类型别名是一个名字,它是某种类型的同义词.使用类型别名有很多好处,它让复杂的类型名字变得简单明了,易于理解和使用,还有助于程序员清楚地知道使用该类型的真是目的
有两种方法可用于定义类型别名.传统的方法是使用关键字typedef:
typedef double wages; //wages是double的同义词
typedef wages base,*p; //base 是double的同义词,p是double*的同义词
其中,关键字typedef作为声明语句中的基本数据类型的一部分出现,含有typedef的声明语句定义的不再是变量而是类别别名.和以前的声明语句一样,这里的声明符也可以包含类型修饰,从而也能由基本数据类型构造出复合类型来.
新标准规定了一种新的方法,使用别名声明来定义类型的别名:
using SI=Sales_Item; //SI是Sales_Item的同义词
这种方法用关键字using作为别名声明的开始,其后紧跟别名和等号,其作用是把等号左侧的名字规定成等号右侧类型的别名.
类型别名和类型的名字等价,只要是类型的名字能出现的地方,就能使用类型别名:
wages hourly,weekly; //等价于double hourly,weekly;
SI item; //等价于Sales_item item;
如果某个类型别名指代的是复合类型常量,那么把它用到声明语句里就会产生意想不到后果,例如下面的声明语句用到了类型pstring,它实际上是类型char*的别名:
typedef char*pstring;
const pstring cstr=0; //cstr是指向char的常量指针
const pstring *ps; //ps是一个指针,它的对象是指向char的常量指针
上述两条声明语句的基本数据类型都是const pstring,和过去一样,const是对给定类型的修饰.pstring实际上是指向char的指针,因此const pstring就是指向char的常量指针,而非指向常量字符的指针.
遇到一条使用了类型别名的声明语句时,人们往往会错误地尝试把类型别名替换成它本来的样子,以理解该语句的含义:
const char* cstr=0; //是对const pstring cstr的错误理解
这种理解是错误的声明语句中用到pstring时,其基本数据类型是指针.可是用char*重写了声明语句之后,数据类型就变成了char,*成为了声明符的一部分.这样改写的结果是,const char成了基本数据类型.前后两种生命含义截然不同,前者声明了一个指向char的常量指针,改写后的形式则生命了一个指向const char的指针.