C语言难点2之预处理器
1 预处理阶段
在预处理阶段中,C预处理器在源代码编译之前对其进行一些文本性质的操作。它的主要任务包括删除注释,插入被#include指定包含的文件的内容,定义和替换由#define指令定义的符号一起确定代码的部分内容是否应该根据一些条件编译指令进行编译。
2 #define命令
采用宏定义时候的易错点:
格式:
#define name stuff
有了这条指令之后,每当有符号name出现在这条指令后面时,预处理器就会把它替换成stuff。
注意:宏定义后面不能加上分号;
#define机制包括了一个规定,允许把参数替换到文本中,这周实现通常称为宏或者定义宏;
格式:
#define name(parameter-list) stuff
其中,parameter list是UI个由符号分割的符号列表,他们可能出此案在stuff中。
注意:(1)参数列表的左括号必须与name紧邻。如果两者之间由任何空白存在,参数列表就会被解释成stuff的一部分。
(2)注意括号的使用,由于运算顺序的不同,加不加括号会直接影响结果的。
举例:
3 #define替换步骤
4 把宏参数插入到字符串中
两种技巧:
首先,邻近字符串自动连接的特性使我们很容易吧一个字符串分成几段,没段实际上都是一个宏参数。
例如:
第二个技巧使用预处理器把宏参数转换成一个字符串,#argument这种结构被预处理器翻译为“argument”。这种
例如:
注意,一种用的比较奇特的是使用##结构,它把位于它两边的符号连接成为一个符号。作为用途之一,它允许宏定义从分离的文本片段创建标识符。
例如:
5 带副作用的宏参数
就是参数每次使用的时候都会是最初始的数值,不会因为处理的变化而变化,我们在上面的第2部分谈到过。
6 宏和函数的比较
7 #undef命令
指令格式
#undef name
如果一个现存的名字需要被重新定义,那么它的旧定义首先必须用#undef移除。
8 条件编译
完整的语法:
9 是否被定义
有时候需要判断一个符号是否被定义,使用如下语句中的任意一句都可以
10 文件包含
#include指令:预处理器删除这条指令,并用包含文件的内容取而代之。
如果一个头文件被包含到10个源文件中,它实际上被编译了10次。
库函数包含:#include <filename>
本地文件包含:#include "filename"
11 其他的指令
错误指令: #error text of error message 这个指令允许你生成错误信息
#line 指令 : #line number "string"
12 编程提示的总结