返回介绍

I.1 使用一些预处理器编译指令的替代品

发布于 2024-10-08 23:14:18 字数 3455 浏览 0 评论 0 收藏 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文