【asp精品源码栏目提醒】:本文主要为网学会员提供“【精品】typedef小结 - 其它资料”,希望对需要【精品】typedef小结 - 其它资料网友有所帮助,学习一下!
typedef 用法小结 收藏来源一:Using typedef to Curb Miscreant Code Typedef 声明有助于创建平台无关类型,甚至能隐藏复杂和难以理解的语法。
不管怎样,使用 typedef 能为代码带来意想不到的好处,通过本文你可以学习用 typedef 避免缺欠,从而使代码更健壮。
typedef 声明,简称 typedef,为现有类型创建一个新的名字。
比如人们常常使用typedef 来编写更美观和可读的代码。
所谓美观,意指 typedef 能隐藏笨拙的语法构造以及平台相关的数据类型, 从而增强可移植性和以及未来的可维护性。
本文下面将竭尽全力来揭示 typedef 强大功能以及如何避免一些常见的陷阱。
如何创建平台无关的数据类型,隐藏笨拙且难以理解的语法使用 typedefs 为现有类型创建同义字。
定义易于记忆的类型名 typedef 使用最多的地方是创建易于记忆的类型名,用它来归档程序员的意图。
类型出现在所声明的变量名字中,位于 typedef 关键字右边。
例如:typedef int size 此声明定义了一个 int 的同义字,名字为 size。
注意 typedef 并不创建新的类型。
它仅仅为现有类型添加一个同义字。
你可以在任何需要 int 的上下文中使用 size:void measuresize pszsize array4size len file.getlengthstd::vector vs typedef 还可以掩饰符合类型,如指针和数组。
例如,你不用象下面这样重复定义有 81个字符元素的数组:char line81char text81定义一个 typedef,每当要用到相同类型和大小的数组时,可以这样:typedef char Line81Line text secondlinegetlinetext同样,可以象下面这样隐藏指针语法:typedef char pstrint mystrcmppstr pstr 这里将带我们到达第一个 typedef 陷阱。
标准函数 strcmp有两个‘const char 类型的参数。
因此,它可能会误导人们象下面这样声明 mystrcmp:int mystrcmpconst pstr const pstr 这是错误的,按照顺序, ‘const pstr被解释为‘char const(一个指向 char 的常量指针) 。
这个问题很容易解决: ,而不是‘const char (指向常量 char 的指针)typedef const char cpstrint mystrcmpcpstr cpstr // 现在是正确的记住:不管什么时候,只要为指针声明 typedef,那么都要在最终的 typedef 名称中加一个const,以使得该指针本身是常量,而不是对象。
代码简化 上面讨论的 typedef 行为有点像 define 宏,用其实际类型替代同义字。
不同点是typedef 在编译时被解释,因此让编译器来应付超越预处理器能力的文本替换。
例如:typedef int PF const char const char 这个声明引入了 PF 类型作为函数指针的同义字, 该函数有两个 const char 类型的参数以及一个 int 类型的返回值。
如果要使用下列形式的函数声明,那么上述这个 typedef 是不可或缺的:PF RegisterPF pf Register 的参数是一个 PF 类型的回调函数,返回某个函数的地址,其署名与先前注册的名字相同。
做一次深呼吸。
下面我展示一下如果不用 typedef,我们是如何实现这个声明的:int Register int pfconst char const char const char const char 很少有程序员理解它是什么意思,更不用说这种费解的代码所带来的出错风险了。
显然,这里使用 typedef 不是一种特权,而是一种必需。
持怀疑态度的人可能会问:OK,有人还会写这样的代码吗?,快速浏览一下揭示 signal函数的头文件 ,一个有同样接口的函数。
typedef 和存储类关键字(storage class specifier) 这种说法是不是有点令人惊讶,typedef 就像 auto,extern,mutable,static,和 register一样,是一个存储类关键字。
这并是说 typedef 会真正影响对象的存储特性;它只是说在语句构成上,typedef 声明看起来象 static,extern 等类型的变量声明。
下面将带到第二个陷阱:typedef register int FAST_COUNTER // 错误 编译通不过。
问题出在你不能在声明中有多个存储类关键字。
因为符号 typedef 已经占 。
据了存储类关键字的位置,在 typedef 声明中不能用 reg