C语言复习之预处理器
一.前言
1.编译一个C程序涉及很多步骤。其中第一步骤称为预处理(preprocessing)阶段。C预处理器(preprocessor)在源代码编译之前对其进行文本性质的操作。
2.它的主要任务包括删除注释、插入被#include指令包含的内容、定义和替换由#define指令定义的符号以及确定代码的部分内容是否应该根据一些条件编译指令经行编译。
二.预定义符号
1.以下为预处理器定义的符号。它们的值或者是字符串常量,或者是十进制数字常量。
2.__FILE__和__LINE__在确认调试输出时很有用。__DATE__和__TIME__常常用于在被编译的程序中加入版本信息。
3.__STDC__用于那些在ANSI环境和非ANSI环境都必须进行编译的程序中结合条件编译。
注:
此处的前缀是两个下划线.
² __FILE__:用%s进行输出,输出结果为源程序名。
² __LINE__:用%d进行输出,输出结果为文件当前行号。
² __DATE__:用%s进行输出,输出结果为文件被编译的日期
² __STDC__:用%d进行输出,如果编译器遵循ANSIC,其数值为1。否则未定义。
三.#define
1.#define的用法:
#define name stuff
有了这条指令以后,每当有符号name出现在这条指令后面时,预处理器就会把它替换成stuff。
2.替换文本并不仅限于数值字面值常量。使用#define指令,可以把文本替换到程序中。
3.如果定义中的stuff非常长,可以将其分成几行,除了最后一行之外,每行的末尾都要加一个反斜杠。
Eg:
#define DEBUG_PRINT printf(“File %s line%d:” \
”x=%d,y=%d,z=%d”,\
__FILE__,__LINE__,\
x,y,z)
说明:此处利用了相邻的字符串常量被自动连接为一个字符串的这个特性。
4.在宏定义的末尾不要加上分号。如果加了则会出现一条空语句。
Eg:
DEBUG_PRINT;
此时,编译器替换后会都一条空语句.
1>有时候只允许出现一条语句,如果放入两条语句就会出现问题
Eg:
if(…)
DEBUG_PRINT;
else
…..