读《C专家编程》笔记-第三章 分析C语言的声明

本文详细解释了typedef的概念,如何为现有类型命名,以及与宏的区别。同时提供了使用typedef的提示,包括避免将多个声明放入一个typedef中,以及在数组、结构、指针和函数组合类型中的应用。最后讨论了typedef与宏的不同之处,以及在声明变量时的注意事项。
摘要由CSDN通过智能技术生成

typedef

typedef为一种类型引入新的名字,而不是为变量分配空间。在某些方面typedef类似于宏文本替换-它并没有引入新类型,而是为现有类型取个新名字,但他们之间存在一个关键性的区别。typedef看上去跟变量声明完全一样,普通的声明表示“这个名字是一个指定类型的变量”,而typedef关键字并不创建一个变量,而是宣称“这个名字是指定类型的同义词”。
必须注意typedef的缺点,他同样具有与其他声明一样的混乱语法,同样可以把几个声明塞到一个声明中去。对于结构,除了可以在书写时省掉struct关键字之外,typedef并不能提供显著的好处,而少写一个struct并没有多大帮助。在任何typedef声明中,甚至不必把typedef房子啊声明的开始位置。
关于操作声明器的一些提示。不要在一个typedef中放入几个声明器,如下所示:

typedef int  *ptr, (*fun)(), arr[5];
/*ptr 是“指向int 的指针类型”
/*fun 是“指向返回值为int 的函数指针”
/*arr 是“长度为5int 型数组“

千万不要把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也可以为后面的强制类型转换提供一个简单的名字。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值