什么是预处理?
预定义符号
#define 指令
#define 指令定义的内容。如果在文本中有出现,就会简单直接替换成原有的内容。
1、宏
#define替换
宏参数和#define定义可以包含其他#define定义的符号。但是宏不可以出现递归。
宏与函数
较小的逻辑处理可以使用宏来实现,因为函数的话会导致程序的规模和速度处于劣势;
另外宏是与类型无关的,没有限制参数类型的;
相比较于函数,宏的缺点是每处使用宏时,一份宏定义代码的拷贝都将插入到程序中,除非宏定义很短,否则这样反而会更加程序的长度。
带副作用的宏参数
副作用就是在表达式求值时出现的永久性效果。
例如:
命名约定
宏和函数存在一些不同的地方,#define定义出的符号也和真正的变量有所不同。以示区别,我们常把宏名字和define符号大写。
#undef
命令行定义
-Dname ,就声明了name这个宏,其值默认为1,当然默认值也会根据不同的编译器有所不同;
-Dname=stuff,声明了name这个宏,并时期值为stuff这个值;
提供符号命令行定义的编译器通常也提供在命令行中去除符号的定义,在UNIX编译器上,用-U可以执行这个任务,-Uname就可以把name这个宏给去掉。当这个任务和条件编译结合使用时,这个特性会很有用的。
条件编译
是否被定义
嵌套指令
文件包含
一般库文件包含用 #include 然后本地文件包含用#include "filename"
文件包含如果不适用绝对路径,就会去相应默认那几个位置去查找;
在一个将被其他文件包含的文件中使用#include指令是可能的。这样包含了这个文件的源文件也会自动包含另一个inlcude文件。标准要求编译器支持至少8层的头文件嵌套,但我们应该记住尽量不要包含太深。另外这种也会导致多重包含,虽然一般没什么问题,但诸如make这样的工具在使用时必须明确文件相互之间的依赖关系,我们解决的办法是使用条件编译这种方法来避免一个头文件被多次包含,使其只包含一次。(详情看C&POINTER290)
其他指令