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 选择结构很像。请看下面这段预处理器的代码:
你也可以只在调试时进行编译,调试开关可以使用一个宏来实现,如下所示:
如果在指令 #ifdef
DEBUG 之前已经定义了符号常量 DEBUG,则会对程序中的
cerr 语句进行编译。您可以使用 #if 0 语句注释掉程序的一部分,如下所示:
让我们尝试下面的实例:
当上面的代码被编译和执行时,它会产生下列结果:
以上就是有关C++ 预处理器的相关内容了,想要了解更多有关c++的其它知识也可关注六星社区网站。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!