C++官方参考链接:Preprocessor directives - C++ Tutorials (cplusplus.com)
预处理器指令
预处理器指令是包含在程序代码中前面带井号(#)的行。这些行不是程序语句,而是用于预处理器的指令。预处理器在开始实际编译代码之前检查代码,并在通常语句实际生成任何代码之前解析所有这些指令。
这些预处理器指令只能跨一行代码扩展。只要找到换行符,预处理器指令就结束。预处理器指令的末尾不需要分号(;)。预处理器指令可以扩展到多行,唯一的方法是在行尾的换行符前加上反斜杠(\)。
宏定义(#define, #undef)
要定义预处理器宏,可以使用#define。它的语法是:
#define identifier replacement
当预处理程序遇到这个指令时,它会用replacement替换代码中出现的任何的identifier。这个replacement可以是一个表达式、一条语句、一个块或任何东西。预处理器并不完全理解C++,它只是用replacement替换任何的identifier的出现。
#define TABLE_SIZE 100
int table1[TABLE_SIZE];
int table2[TABLE_SIZE];
在预处理器替换了TABLE_SIZE之后,代码等价于:
int table1[100];
int table2[100];
#define也可以使用形参来定义函数宏:
#define getmax(a,b) a>b?a:b
这将用替换表达式(a>b?a:b)替换跟着两个实参的getmax,但也用它的标识符替换每个实参,就像你所期望如果它是一个函数的那样:
// function macro
#include
using namespace std;
#define getmax(a,b) ((a)>(b)?(a):(b))
int main()
{
int x=5, y;
y= getmax(x,2);
cout << y << endl;
cout << getmax(7,x) << endl;
return 0;
}

定义的宏不受块结构的影响。宏持续到使用#undef预处理器指令未定义为止:
#define TABLE_SIZE 100
int table1[TABLE_SIZE];
#undef TABLE_SIZE
#define TABLE_SIZE 200
int table2[TABLE_SIZE];
这将生成如下代码:
int table1[100];
int table2[200];
函数宏定义在替换序列中接受两个特殊操作符(#和##):
操作符#后面跟一个形参名,被一个包含传入实参的