- 内容提要
- 前言
- 第 1 章 预备知识
- 第 2 章 开始学习 C++
- 第 3 章 处理数据
- 第 4 章 复合类型
- 第 5 章 循环和关系表达式
- 第 6 章 分支语句和逻辑运算符
- 第 7 章 函数——C++的编程模块
- 第 8 章 函数探幽
- 第 9 章 内存模型和名称空间
- 第 10 章 对象和类
- 第 11 章 使用类
- 第 12 章 类和动态内存分配
- 第 13 章 类继承
- 第 14 章 C++中的代码重用
- 第 15 章 友元、异常和其他
- 第 16 章 string 类和标准模板库
- 第 17 章 输入、输出和文件
- 第 18 章 探讨 C++新标准
- 附录 A 计数系统
- 附录 B C++保留字
- 附录 C ASCII 字符集
- 附录 D 运算符优先级
- 附录 E 其他运算符
- 附录 F 模板类 string
- 附录 G 标准模板库方法和函数
- 附录 H 精选读物和网上资源
- 附录 I 转换为 ISO 标准 C++
- 附录 J 复习题答案
I.1 使用一些预处理器编译指令的替代品
C/C++预处理器提供了一系列的编译指令。通常,C++惯例是使用这些编译指令来管理编译过程,而避免用编译指令替换代码。例如,#include 编译指令是管理程序文件的重要组件。其他编译指令(如# ifndef 和# endif)使得能够控制是否对特定的代码块进行编译。# pragma 编译指令使得能够控制编译器特定的编译选项。这些都是非常有帮助(有时是必不可少)的工具。但使用# define 编译指令时应谨慎。
I.1.1 使用 const 而不是#define 来定义常量
符号常量可提高代码的可读性和可维护性。常量名指出了其含义,如果要修改它的值,只需定义修改一次,然后重新编译即可。C 使用预处理器来创建常量的符号名称。
这样,预处理器将在编译之前对源代码执行文本置换,即用 100 替换所有的 MAX_LENGTH。
而 C++则在变量声明使用限定符 const:
这样 MAX_LENGTH 将被视为一个只读的 int 变量。
使用 const 的方法有很多优越性。首先,声明显式指明了类型。使用# define 时,必须在数字后加上各种后缀来指出除 char、int 或 double 之外的类型。例如,使用 100L 来表明 long 类型,使用 3.14F 来表明 float 类型。更重要的是,const 方法可以很方便地用于复合类型,如下例所示:
最后,const 标识符遵循变量的作用域规则,因此,可以创建作用域为全局、名称空间或数据块的常量。在特定函数中定义常量时,不必担心其定义会与程序的其他地方使用的全局常量冲突。例如,对于下面的代码:
预处理器将把:
替换为:
从而导致编译错误。而 fizzle( ) 中定义的 dz 是本地变量。另外,必要时,fizzle( ) 可以使用作用域解析运算符(::),以::dz 的方式访问该常量。
虽然 C++借鉴了 C 语言中的关键字 const,但 C++版本更有用。例如,对于外部 const 值,C++版本有内部链接,而不是变量和 C 中 const 所使用的默认外部链接。这意味着使用 const 的程序中的每个文件都必须定义该 const。这好像增加了工作量,但实际上,它使工作更简单。使用内部链接时,可以将 const 定义放在工程中的各种文件使用的头文件中。对于外部链接,这将导致编译错误,但对于内部链接,情况并非如此。另外,由于 const 必须在使用它的文件中定义(在该文件使用的头文件中定义也满足这样的要求),因此可以将 const 值用作数组长度参数:
这在 C 语言中是行不通的,因为定义 MAX_LENGTH 的声明可能位于一个独立的文件中,在编译时,该文件可能不可用。坦白地说,在 C 语言中,可以使用 static 限定符来创建内部链接常量。也就是说,C++通过默认使用 static,让您可以少记住一件事。
顺便说一句,修订后的 C 标准(C99)允许将 const 用作数组长度,但必须将数组作为一种新式数组——变量数组,而这不是 C++标准的一部分。
在控制何时编译头文件方面,# define 编译指令仍然很有帮助:
但对于符号常量,习惯上还是使用 const,而不是#define。另一个好方法——尤其是在有一组相关的整型常量时——是使用 enum:
I.1.2 使用 inline 而不是# define 来定义小型函数
在创建类似于内联函数的东西时,传统的 C 语言方式是使用一个#define 宏定义:
这将导致预处理器进行文本置换,将 X 替换为 Cube( ) 的参数:
由于预处理器使用文本置换,而不是真正地传递参数,因此使用这种宏可能导致意外的、错误的结果。要避免这种错误,可以在宏中使用大量的圆括号来确保正确的运算顺序:
但即使这样做,也无法处理使用诸如 Z++等值的情况。
C++方法是使用关键字 inline 来标识内联函数,这种方法更可靠,因为它采用的是真正的参数传递。另外,C++内联函数可以是常规函数,也可以是类方法:
#define 宏的一个优点是,它是无类型的,因此将其用于任何类型,运算都是有意义的。在 C++中,可以创建内联模板来使函数独立于类型,同时传递参数。
总之,请使用 C++内联技术,而不是 C 语言中的#define 宏。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论