C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。
预处理指令包括条件编译、源文件包含、宏替换、行控制、抛错、杂注和空指令。
1、条件编译
条件编译的功能是根据条件有选择性的保留或者放弃源文件中的内容。常见的条件包含#if、#ifdef、#ifndef指令开始,以#endif结束。用#undef 指令可对用#define定义的标识符取消定义。
例:
#if defined(CREDIT)
credit();
#elif defined(DEBIT)
debit();
#else
printerror();
#endif
2、源文件包含
源文件包含指令的功能是搜索指定的文件,并将它的内容包含进来,放在当前所在的位置。源文件包含有两种,包含系统文件以及用户自定义文件。
#include <stdio.h>
让C编译器去系统目录下查找相关文件
#include "test.c"
让C编译器去用户目录下查找相关文件
3、宏替换
宏的作用是把一个标识符指定为其他一些成为替换列表的预处理记号,当这个标识符出现在后面的文本中时,将用对应的预处理记号把它替换掉,宏的本质是替换。
宏的定义分为两种方式:有参和无参。
1、无参数的宏(对象式宏定义)
#define MAX 100
2、有参数的宏(函数式宏定义)
#define MAX(a,b) ((a)>(b)?(a):(b))
4、行控制
行控制指令以"#"和“line”引导,后面是行号和可选的字面串。它用于改变预定义宏"__LINE__"的值,如果后面的字面串存在,则改变“__FILE__”的值。
仔细看下面的例程就能很快了解。最左边显示的是行号,之后用#line改变了行号,于是#line的下一行就是3。
5、抛错
抛错指令是以“#”和“error”引导,抛错指令用于在预处理期间发出一个诊断信息,在停止转换。抛错是人为的动作。
下面是个一个简单的例程,抛错后,编译器会有提示。
6、杂注
杂注指令用于向C实现传递额外的信息(编译选项),对程序的某些方面进行控制。
杂注指令以“#”开始,跟着“pragma”,后面是其他预处理记号,即所谓的选项。下面这个杂注用于指示C实现将结构成员对齐到字节边界。
# pragma pack(1)
7、空指令
空指令只有一个“#”,自成一行,空指令的使用没有效果。