预处理程序读入所有包含的文件以及待编译的源代码,然后生成源代码的预处理版本。在预处理版本中,宏和常量标识符已全部被相应的代码和值替换掉了。如果源代码中包含条件预处理指令(如#if),那么预处理程序将先判断条件,再相应地修改源代码。
下面的例子中使用了多种预处理指令:
# include <stdio. h>
# define TRUE 1
# define FALSE (!TRUE)
# define GREATER (a, b) ((a) >(b) ? (TRUE) : (FALSE))
# define PIG-LATIN FALSE
void main (void)
void main (void)
{
int x, y
# if PIG_LATIN
printf("Easeplay enternay ethay aluevay orfay xnay:")
scanf("%d", &x)
printf("Easeplay enternay ethay aluevay orfay ynay:")
scanf("%d", &y)
#else
printf(" Please enter the value for x: ")
scanf("%d", &x)
printf("Please enter the value for y: ")
scanf("%d", &y)
# endif
if (GREATER(x, y) = = TRUE)
{
# if PIG- LATIN
printf("xnay islay eatergray anthay ynay!\n")
#else
printf {" x is greater than y! \n" )
# endif
}
else
{
# if PIG_LATIN
printf ("xnay islay otnay eatergray anthay ynay!\n")
#else
printf ("x is not greater than y!\n")
# endif
}
}
上例通过预处理指令定义了3个标识符常量(即TRUE,FALSE和PIG_LATIN)和一个宏(即GREATER(a,b)),并使用了一组条件编译指令。当预处理程序处理上例中的源代码时,它首先读入stdio.h头文件,并解释其中的预处理指令,然后把所有标识符常量和宏用相应的值和代码替换掉,最后判断PIG_LATIN是否为TRUE,并由此决定是使用拉丁文还是使用英文。
如果PIG_LATIN为FALSE,则上例的预处理版本将如下所示:
/ * Here is where all the include files
would be expanded. * /
void main (void)
{
int x, y
printf("Please enter the value for X: ")
scanf("%d", &x)
printf("Please enter the value for y: ")
scanf("%d", &y),
if (((x) >(y) ? (1) : (!1)) == 1)
{
printf("x is greater than y!\n")
}
else
{
printf{"x is not greater than y!\n")
}
}
多数编译程序都提供了一个命令行选项,或者有一个独立的预处理程序,可以让你只启动预处理程序并将源代码的预处理版本保存到一个文件中。你可以用这种方法查看源代码的预处理版本,这对调试与宏或其它预处理指令有关的错误是比较有用的。
中国物联网校企联盟技术部
预处理可以完成很多功能,常用的有处理文件包含,例如我们在程序里面写#include<stdio.h>,预处理程序就把stdio.h文件复制一份插入到程序里面。另外一个常用的处理是宏定义,例如源程序里面有#define PI 3.14语句,预处理就把程序里面所有的PI进行替换。预处理就是解决那些#语句的。
预编译又称为预处理 , 是做些代码文本的替换工作。处理 # 开头的指令 ,比如拷贝 #include 包含的文件代码,#define 宏定义的替换 , 条件编译等,就是为编译做的预备工作的阶段,主要处理#开始的预编译指令,预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的任何位置。c 编译系统在对程序进行通常的编译之前,先进行预处理。 c 提供的预处理功能主要有以下三 种:1)宏定义 #define min(a,b)((a)>(b)?(b)::(a))2 )文件包含 如:#include <stdio.h>3 )条件编译#ifndefGRAPHICS_H#define GRAPHICS_H*****#endif #ifdefGRAPHICS_H *****#else*****#endif