ad

《C++程序开发案例课堂》_了解C++的更好途径_2.2 编译前的预处理

admin 61 2023-11-01

【摘要】 本书摘自《C++程序开发案例课堂》一书中第2章,第2节,由刘春茂、李琪编著。

2.2 编译前的预处理

C++ 的预处理(preprocess), 是指在 C++ 程序源代码被编译之前,由预处理器(preprocessor) 对 C++ 程序源代码进行的处理。虽然预处理命令不是 C+ 语言的一部分,但是它有扩展 C++ 程序设计环境的作用。

预处理命令是C++ 统一规定的,但是它不是 C++ 语言本身的组成部分,不能直接 对它们进行编译(因为编译程序不能识别它们)。

在预处理中,包含以下一些常用的预处理。

● #include: 包含头文件。

● #if: 条件。

《C++程序开发案例课堂》_了解C++的更好途径_2.2 编译前的预处理

● #else: 否则。

● #elif: 否则如果。

● #endif: 结束条件。

● #ifdef 或#ifdefined: 如果定义了一个符号,就执行操作。

● #Hifndef或#if!defined: 如果没有定义一个符号,就执行操作。

● #define: 定义一个符号。

● #undef: 删除一个符号。

● #line: 重新定义当前行号和文件名。

● #error: 输出编译错误停止编译。

● #pragma: 提供专用的特性,同时保证与C++ 的完全兼容。 下面对几个常用的预处理进行详细的说明。

1.#include 在程序中包含头文件

#include 的作用是将另外一个源文件的内容合并到当前程序中,被合并的源文件称为“头 文件"。头文件通常以.h 结尾,其内容可使用#include 预处理器指令包含到程序中。使用 include 命令可以减少程序员的重复劳动。

头文件中一般包含函数原型与全局变量。

包含头文件的形式常有下面两种:

前者◇用来引用标准库头文件;后者""常用来引用自定义的头文件。

对于前者,编译器只搜索包含标准库头文件的默认目录;对于后者,编译器首先搜索正 在编译的源文件所在的目录,找不到时再搜索包含标准库头文件的默认目录。

如果把头文件放置在其他目录下,为了查找到它,必须在双引号中指定从源文件到头文 件的完整路径。

2.#define定义符号、宏

1) 符号

#define PI 3.1415925

定义符号PI 为3.1415925。

#undef PI

取消PI 的值。这里 PI 看起来像一个变量,但它与变量没有任何关系,它只是一个符号或标志。在代码 编译前,此符号会用一组指定的字符来代替3.14159265,不是一个数值,只是一个字符串, 不会进行类型检查。

在编译前,预处理器会遍历代码,在它认为置换有意义的地方,用字符串 PI 的定义值 (3.14159265)来代替在注释或字符串中的PI, 不是进行替换。

在C 中常以#define 来定义符号常量,如上面的#define PI3.14159265,但在C++ 中最好使 用const来定义常量。代码如下:

const long double PI=3. 14159265;

两者相比较,前者没有指定类型,容易引起不必要的麻烦,而后者定义清楚,所以在 C++中推荐使用const来定义常量。

#define有以下缺点。

(1)不支持类型检查。

(2)不考虑作用域。

(3)符号名不能限制在一个命名空间中。

2) #undef删除#define定义的符号 代码如下:

之后不再有PI这个标识符。

3) 定义宏

#define Print(Var)count<<(Var)<

将宏名中的参数代入语句中的参数。 var 是代入参数表。带参数的宏相当于一个函数的功 能,但是比函数更加便捷。宏后面没有分号。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 [email protected] 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:《C++程序开发案例课堂》_了解C++的更好途径_10.7.2 静态成员函数
下一篇:《C++程序开发案例课堂》_了解C++的更好途径_10.3 成员函数
相关文章

 发表评论

暂时没有评论,来抢沙发吧~

×