C语言typedef用法_第1页
C语言typedef用法_第2页
C语言typedef用法_第3页
C语言typedef用法_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、typedef 声明,简称typedef ,为现有类型创建一个新的名字。比如人们常常使用ypedef来编写更美观和可读的代码。所谓美观,意指typedef能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性和以及未来的可维护性。typedef使用最多的地方是创建易于记忆的类型名,用它来归档程序员的意图。类型出现在所声明的变量名字中,位于"typedef"关键字右边。例如:typedef int size;此声明定义了 一个int的同义字,名字为 size。注意typedef 并不创建新的类 型。它仅仅为现有类型 添加一个同义字。你可以在 任何需要int的上下文 中使

2、用size.typedef还可以掩饰符合 类型,如指 针和数组。例如,你不用象下面这样重复定义有81个字符元素 的数组:char lin e81;char text81;定义一个typedef ,每当要用到相同类型和大小的数组时,可以这样:typedef char Lin e81;Line text, sec on dli ne;typedef 有另外一个重要的用途,那就是定义机器无 关的类型,例如,你可以定义 一个叫REAL的浮点类型,在 目标机器上 它可以i获得最高的精度:typedef long double REAL;在不支持long double 的机器上,该typedef 看起来会

3、是下面这样:typedef double REAL;并且,在连double都不支持 的机器上,该typedef看起来会是这样:typedef float REAL;你不用对源 代码做任何修改,便可以在 每一种平台上编译这个使用REAL类型的 应用程序。唯一要改的是typedef 本身。在大多数情况下,甚 至这个微小的变动完 全都可以通过奇妙 的条件编译来自动实 现。不是吗?标准库广泛 地使用typedef 来创 建这样 的平台 无关类型:size_t , ptrdiff 和fpos_t 就是其中的例 子。此外,象st d:string 和std:ofstream 这样 的typedef 还隐

4、藏了长长 的,难以理解 的模板特 化语法,例如: basic_stri ngvchar, char_traits<char>, allocator<char>> 禾口 basic_ofstream<char, char_traits<char>> 。注1:注意typedef 与define 的区别typdef kkk int *kkk a,b则a,b类型相同define kkk int *kkk a,b则a,b类型不同注2:typedef in t (*mac_liste n_fun c)(i nt*,char*);mac_liste n_

5、func mlf1,mlf2;等价定义:in t (*mlf1)(i nt*,char*);in t (*mlf1)(i nt*,char*);上面的方式使用比较方便,可读性也比较好。typedef 声明,简称 typedef ,为现有类型创建一个新的名字。比如人们常常使用typedef来编写更美观和可读的代码。所谓美观,意指typedef能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性和以及未来的可维护性。本文下面将竭尽全力来揭示typedef 强大功能以及如何避免一些常见的陷阱。如何创建平台 无关的数据类型,隐藏笨拙且难以理解的语法?使用typedefs为现有类型创建同义字。定

6、义易于记忆的类型名typedef使用最多的地方是创建易于记忆的类型名,用它来归档程序员的意图。类型出现在所声明的变量名字中,位于"typedef"关键字右边。例如:typedef int size;此声明 定义了 一个int的同义字,名字为 size。注意typedef 并不创建新的 类型。它 仅仅 为现有类型 添加一个同义字。你可以在 任何需要int的上下文 中使用 size :void measure(size * psz);size array4;size len = file.getle ngth(); std:vector <size> vs;type

7、def还可以掩饰符合 类型,如指 针和数组。例如,你不用象下面这样重复定义有81个字符元素的数组:char lin e81;char text81;定义一个typedef ,每当要用到相同类型和大小的数组时,可以这样:typedef char Lin e81;Line text, sec on dli ne;getl in e(text);同样,可以象下面这样隐藏指针语法:typedef char * pstr;int mystrcmp(pstr, pstr);这里将带我 们到达第一个typedef 陷阱。标准 函数strcmp() 有两个c'onst char * '类型的

8、参数。因此,它可能 会误导人们象下面这样 声明 mystrcmp() :int mystrcmp(c onst pstr, const pstr);这是错误 的,按照顺 序,onst pstr '被解释 为Char * const '(一个指 向cha r的常量指 针),而不是Eon st char * '(指向常量char的指针)。这个问题很容 易解决:typedef const char * cpstr;int mystrcmp(cpstr, cpstr); /现在是正确的记住:不管什么 时候,只要为指针声明typedef ,那么都要在最终的typedef 名称 中

9、加一个const,以使 得该指针本身 是常量,而 不是对象。代码简化上面讨论的typedef 行为有点像#define 宏,用其实际类型替代同义字。不 同点是typedef 在编译时被解释,因此让编译器来应付超越预处理 器能力的文本替 换。例如:typedef int (*PF) (const char *, const char *);这个声明引入了 PF类型作为函数指针的同义字,该函数有两个con st char * 类型的 参数以及一个int类型的 返回值。如 果要使用下列形式 的函数声明,那么上述这个typedef 是不可或缺的:PF Register(PF pf);Register。

10、的参数是一个 PF类型的回调函 数,返回某个函数的地 址,其署名与先前注册的名字相 同。做一次深呼吸。下面我展示一下如果不用typedef ,我们是 如何实现这个声明的:int (*Register (int (*pf)(c onst char *, const char *)(const char *, const char *);很少有程序员 理解它是什么意思,更不用说这种费解的代码所 带来的出 错风险了。 显然,这里使用typedef 不是一种特权,而是一种必需。持怀疑态 度的人可能 会问: OK,有人还会写这样的代码 吗? ” 快速浏览 一下揭示signal()函数的头文件<cs

11、 inal> ,一个有 同样 接口的函数。typedef禾口存储类关键字( storage class specifier )这种 说法是 不是有 点令人惊讶,typedef 就像auto ,extern , mutable ,stat ic ,和register 一样,是一个存储类关键字。这并是说typedef 会真正影响对象的 存储特性;它只是说在语句构成上,typedef 声明看起来象static ,extern 等类型 的变量声明。下面将带到第二个陷阱:typedef register int FAST_COUNTER; /错误编译通不过。问题出在你不能在声明中有多个存储类关键字

12、。因为符号typedef已经占 据了存储 类关键字的位 置,在typedef 声明中不能用register (或任何其 它存储类关键字)。促进跨平台开发typedef 有另外一个重要的用途,那就是定义机器无 关的类型,例如, 你可以定 义一个叫REAL的浮点类型,在 目标机器上 它可以i获得最高的精度:typedef long double REAL;在不支持long double 的机器上,该typedef看起来会是下面这样:typedef double REAL;并且,在连double都不支持 的机器上,该typedef看起来会是这样:、typedef float REAL;你不用对源代码

13、做任何修改,便可以在 每一种平台上编译这个使用 REAL类型 的应用程序。 唯一要改的是typedef 本身。在大多数情况下,甚至这个微小的变动 完全都 可以通过奇妙 的条件编译来自动实 现。不是吗?标准 库广泛 地使用typedef 来创建 这样的平台 无关类型:size_t , ptrdiff 和fpos_t 就是其中的例 子。此外, 象std:string 和std:ofstream 这样的typedef 还隐藏了长长的,难以理解的 模板特化语法,例如:basic_stringvchar, char_traits<char>,allocator<char>>禾口 basic_ofstream<char, char_traits<char>>。窘作者简介DannyKalev 是一名 通过 认证 的系统分析师,专攻 C+ 和形式 语言

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论