page contents

C++ 预处理器

C++预处理(Preprocess)是指在C++程序源代码被编译之前,由预处理器(Preprocessor)对C++程序源代码进行的处理。这个过程并不对程序的源代码进行解析,但它把源代码分割或处理成为特定的符号用来支持宏调用.....

attachments-2021-08-2BVBLisH612da9c723ea8.png 

C++预处理(Preprocess)是指在C++程序源代码被编译之前,由预处理器(Preprocessor)对C++程序源代码进行的处理。这个过程并不对程序的源代码进行解析,但它把源代码分割或处理成为特定的符号用来支持宏调用。

预处理器指令以#号开头标识,末尾不包含分号。预处理命令不是C++语言本身的组成部分,不能直接对它们进行编译和链接。

C++语言的一个重要功能是可以使用预处理指令和具有预处理的功能。C++提供的预处理功能主要有文件包含、宏替换、条件编译等。

 

1、文件包含

预处理指令#include用于包含头文件,有两种形式:#include <xxx.h>#include "xxx.h"

尖括号形式表示被包含的文件在系统目录中。如果被包含的文件不一定在系统目录中,应该用双引号形式。

在双引号形式中可以指出文件路径和文件名。如果在双引号中没有给出绝对路径,则默认为用户当前目录中的文件,此时系统首先在用户当前目录中寻找要包含的文件,若找不到再在系统目录中查找。

对于用户自己编写的头文件,宜用双引号形式。对于系统提供的头文件,既可以用尖括号形式,也可以用双引号形式,都能找到被包含的文件,但显然用尖括号形式更直截了当,效率更高。

./表示当前目录,../表示当前目录的父目录。 


2、宏替换

简单的来说:宏定义又称为宏代换、宏替换,简称“宏”。宏替换是C/C++的预处理中的一部分,C++标准中有4条规则来定义替换。 

规则1:实参替换

本条规则描述带参数的宏的替换过程。

对于宏定义中的形参,在替换列表中,如果不是作为###的操作数,那么将对应实参完全

展开(相当于对实参进行求值),然后将替换列表中的形参替换掉.如果是###的操作数,

那么不进行替换。 

规则2:多次扫描

在所有的形参替换为实参后,对结果进行再次扫描,如果发现还有可替换的宏,则进行替换,

否则中止。 

规则3:递归替换抑制

如果在替换列表中发现当前正在展开的宏的名字,那么这里不进行替换.更进一步,在嵌套

的替换过程中发现已经替换过的宏的名字,则不进行替换。 

规则4:递归预处理抑制

如果替换后的结果形成预处理指令,则不执行这条预处理指令。


3、条件编译

有几个指令可以用来有选择地对部分程序源代码进行编译。这个过程被称为条件编译。

条件预处理器的结构与 if 选择结构很像。请看下面这段预处理器的代码:

attachments-2021-08-kVuBdAWD612daa35ea3c8.png

你也可以只在调试时进行编译,调试开关可以使用一个宏来实现,如下所示:

attachments-2021-08-JuzJWMfL612daa3c02ab5.png

如果在指令 #ifdef DEBUG 之前已经定义了符号常量 DEBUG,则会对程序中的 cerr 语句进行编译。您可以使用 #if 0 语句注释掉程序的一部分,如下所示:

attachments-2021-08-5TQf7JVg612daa41838eb.png

让我们尝试下面的实例:

attachments-2021-08-IjESKn2k612daa4661aaa.png

当上面的代码被编译和执行时,它会产生下列结果:

attachments-2021-08-HmJXlSaM612daa4c62839.png





以上就是有关C++ 预处理器的相关内容了,想要了解更多有关c++的其它知识也可关注六星社区网站。

  • 发表于 2021-08-31 12:04
  • 阅读 ( 546 )
  • 分类:C/C++开发

0 条评论

请先 登录 后评论
小柒
小柒

1474 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1474 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章