#define
#define name stuff
当遇到name时,预处理器将之换位stuff
当stuff很长时,除了最后一行之外,每行的末尾都要加一个反斜杠
宏
1.宏定义
#define name(list) stuff
#define square(x) x * x
参数列表的左括号必须与name相邻,如果二者之间有任何空白,参数列表会被解释为stuff的一部分。
宏中,将x直接换到后面表达式中
eg. a = square(5+1)
运算过程:a = 5+1*5+1 = 11
注意括号的加舍
2.宏替换
(1)调用宏时,首先对参数进行检查,任何包含由#define定义的符号将会被替换;替换文本插入到程序中原来文本的位置,宏的参数名被它们的值所替代;最后,再次对结果文本进行扫描,若包含由#define定义的符号,将重复上述流程。
(2)宏中不能出现递归,预处理器搜索由#define定义的符号时,字符串常量的内容不进行检查。
(3)## 结构把位于它两边的符号链接成一个符号。
#define ADD(sum_number, value) \
sum ## sum_number += value
ADD(5,25);
最后一条语句将25加到sum5
3.宏与函数
#define MAX(a,b) ((a) > (b) ? (a) : (b))
函数必须声明为某种类型,宏定义可用于多种类型,它与类型无关。
定义宏时没有“;”,调用宏时有“;”
4带副作用的宏参数
#define MAX(a,b) ((a) > (b) ? (a) : (b))
x = 5;
y = 8;
z = MAX(x++,y++);
程序运行后会发现
x=6,y=10,z=9
原因如下:
z = ( (x++) > (y++) ? (x++) : (y++) )
5.#undef
#undef name
该函数用于移除一个宏定义。
7.条件编译
#if constant_expression
statement
#endif
constant_expression为常量表达式由预处理器进行求值,
常量表达式为字面值常量或者由#define定义的符号,变量在执行之前无法获得值,那它就是非法的。
其他结构
#if constant_expression
statement
#elif constant_expression
other statement
#else
other statement
#endif
8.是否被定义
#if defined(synbol)
#ifdef symbol
两个表达式作用时一样的
9.嵌套指令
#ifdef opt1
...
#else
...
#endif
文件包含
1.定义
#include 指令使另一个文件的内容被编译,替换到该位置。其过程为:预处理器删除这条指令,并用包含在文件的内容取而代之。
2.使用方法
函数库头文件
#define
本地文件
#define “file”
3.使用条件编译消除头文件的多次引用。
小结
1.#argument 结构由预处理转化为字符串常量“argument”,##用于把它两边的文本粘贴成同一个标识符。
2.#error指令在编译时产生一条错误信息,信息中包含你所选中的文本
3.#line指令告诉编译器下一行输入的行号,若加上了可选的内容,就作为编译器输入源文件的名字
4.#program指令允许编译器提供不标准的处理过程,比如一个函数插入内联的汇编代码。