编译预处理是指在对程序进行编译之前所做的预加工处理,此工作在对每一个程序进行编译时都自动进行。
一、ANSI C 定义的标准预处理指令:
#if
#ifdef
#ifndef
#else
#elif
#endif
#define
#undef
#line
#error
#pragma
#include
预处理器处理的对象是预处理指令(preprocessor directives),输出是“翻译单元”(是存放在内存中的临时文件)。
编译器接受预处理器的输出,并把源代码转换成包含机器语言指令的目标文件。
二、书写规定与习惯:
1、每条指令必须单独占用一行。
2、每行末尾不加 ;(因为不是语句)。
3、一般使用全部大写来表示标识符。如: #define LANGUAGE chinese
4、一个预处理指令可以写在程序中的任何位置。通过合理地使用这些指令,可以提高程序的可读性和可移植性。
三、关于 #define 的一些说明:
1、宏中的参数只原样替换,并不求值,而函数的参数则不然。
2、宏中的参数不会被分配内存空间。
3、宏只占用编译时间,而不占用运行时间,但函数则相反。
4、宏被替换后,可能使代码加长,而函数则不会。使用函数的一个主要目的就是是代码可以重用,起到简化代码的作用。
5、宏比函数具有更好的数据类型的适应性(因为它没有参数类型的要求)。
6、宏不能递归调用。
使用类函数宏代替函数的一个主要的优点是能够提高代码的速度(消除了调用的开销)。但是,若类函数宏的尺寸非常大,则会因为复制代码而增加了程序的规模。所以,在 C99 和 C++ 中,定义了 inline 关键字,使程序员能够更好地定义内联代码。
四、关于 #include 的一些说明:
1、文件包含是一种模块化程序的手段,有助于代码的重用。
2、习惯:程序员可将经常使用的常量(宏定义)、多个源文件共同使用的全局变量、函数声明等写成一个或分类写成多个文件,在需要时,可以用 #include 将它(们)包含进来。
3、包含文件中允许嵌套包含(可以包含其它 #include 指令)。允许的最大嵌套深度随编译器的不同而不同。C89 规定编译器最少应能处理 8 层嵌套包含,C99 提升到 15 层。
五、关于条件编译的一些说明:
1、条件编译是为了使商业软件具有更广泛的适应性(或可移植性)而提供的功能。
2、C89 规定,#if -- #elif、#ifdef 和 #ifndef 的嵌套深度最少为 8 层,C99 提升至 63 层。
3、[实例1] #ifdef IBM-PC #define INTSIZE 2 #else #define INTSIZE 4 #endif
[实例2]符号 NULL 在 6 个不同的文件中都有定义:locate.h、stddef.h、stdio.h、stdlib.h、string.h、time.h。一个源文件可能包含其中的几个头文件,这样会使编译器报错。这时需要在每个头文件中使用条件编译: #ifndef NULL #define NULL ((void *)0) #endif