typedef
typedef为一种类型引入新的名字,而不是为变量分配空间。在某些方面typedef类似于宏文本替换-它并没有引入新类型,而是为现有类型取个新名字,但他们之间存在一个关键性的区别。typedef看上去跟变量声明完全一样,普通的声明表示“这个名字是一个指定类型的变量”,而typedef关键字并不创建一个变量,而是宣称“这个名字是指定类型的同义词”。
必须注意typedef的缺点,他同样具有与其他声明一样的混乱语法,同样可以把几个声明塞到一个声明中去。对于结构,除了可以在书写时省掉struct关键字之外,typedef并不能提供显著的好处,而少写一个struct并没有多大帮助。在任何typedef声明中,甚至不必把typedef房子啊声明的开始位置。
关于操作声明器的一些提示。不要在一个typedef中放入几个声明器,如下所示:
typedef int *ptr, (*fun)(), arr[5];
/*ptr 是“指向int 的指针类型”
/*fun 是“指向返回值为int 的函数指针”
/*arr 是“长度为5的int 型数组“
千万不要把typedef嵌到声明的中间部分,如下所示:
unsigned const long typedef int volatile *kumquat;
typedef int x[10]和define x int[10]的区别
在typedef和宏文本替换之间存在一个关键性区别。正确思考这个问题的方法就是把typedef看成是以一种彻底”封装“类型-在声明它之后不能再往里增加别的东西。他和宏的区别体现在两个方面。
首先,可以用其他类型说明符对宏定义类型名进行扩展,但对typedef所定义的类型名却不能这样做。如下所示:
#define peach int
unsigned peach i;/*没问题*/
typedef int banana;
unsigned banana i;/*错误!非法*/
其次,在连续几个变量声明中,用typedef定义的类型能够保证声明中所有的变量均为同一种类型,而用define定义的类型则无法保证,如下所示:
#define int_ptr int *
int_ptr chalk,cheese;
经过宏扩展,第二行变为:
int *chalk,cheese;
这使得chalk和cheese成为不同的类型;chalk是一个指向int 类型的指针,而cheese则是一个int。相反,下面的代码中:
typedef char* char_ptr;
char_ptr Bentley,Rolls_Royce;
Bentley和Rolls_Royce的类型依然吸纳共同。虽然前面的类型名变了,但他们的类型相同,都是指向char的指针。
操作typedef的提示
不要为了方便起见对结构使用typedef。这样做的唯一好处就是少写一个struct。typedef应该用在:
- 数组、结构、指针以及函数的组合类型;
- 可移植类型。比如当你需要一种至少20比特类型时,可以对它进行typedef操作typedef的提示声明。这样,当把代码移植到不同的平台时,要选择正确的类型如 short,int,long,时,只要在typedef中进行修改就可以了,无需对每个声明都加以修改。
- typedef也可以为后面的强制类型转换提供一个简单的名字。