第九章 预处理命令
9.1 宏定义
9.2 文件包含处理
9.3 条件编译
9.1 宏定义
宏定义用预处理命令 #define命令指定的预处理。包括不带参数和带参数宏定义两种。
不带参数宏定义用一个指定的标识符代表一个字符串,
#define 标识符 字符串标识符称为 宏名,字符串称为 宏体 。
在预处理时将该宏名用宏体替换,成为 宏展开 。
9.1 宏定义
说明
为与变量名区别,宏名一般习惯用大写字母表示,
使用宏定义可以提高程序的通用性和可读性,易于修改,
预处理时不进行语法检查,
#define PI 3.l4l59
宏定义不是 c语句,不必加,;”,若有,则将一起处理。
#define PI 3.14159;
area=PI*r*r; /* area=3.14159;*r*r;*/
9.1 宏定义
宏定义的有效范围为宏定义处到文件结束。可以用 #undef命令终止宏定义的作用域。
宏定义时可以引用已经定义的宏名。
程序中用,” 括起来的字符串不进行置换。
宏定义只作字符替换,不分配内存空间。
#define G 9.8
main()
{ …… }
#undef G
f1()
{…… }
9.1 宏定义
带参数宏定义
带参宏定义的格式:
#define 宏名 (参数表 ) 宏体
#define S(a,b) a*b
area=S(2,3); /* area=2*3;*/
带参宏替换在形式上类似函数,也带有形参,调用时也进行实参和形参的结合。
9.1 宏定义
说明
对带参宏定义,宏体及其各个形参应该用圆括号括起来。 如:
#define PI 3.1415926
#define S(r) PI*r*r
area=S(a+b) /* area=PI*a+b*a+b */
m=1/S(a+b) /* m=1/PI*a+b*a+b */
#define S(r) PI*(r)*(r)
area=S(a+b) /* area=PI*(a+b)*(a+b) */
m=1/S(a+b) /* m=1/PI*(a+b)*(a+b) */
#define S(r) (PI*(r)*(r) )
area=S(a+b) /* area=PI*(a+b)*(a+b) */
m=1/S(a+b) /* m=1/(PI*(a+b)*(a+b)) */
9.1 宏定义
宏名与宏体之间以空格相隔,宏名中不能有空格。例:
#define S (r) (PI*(r)*(r))
area=S (a) /* area=(r) (PI*(r)*(r))(a) */
宏名不能用引号括起来。
如,#define,YES” 1将不进行宏替换。
同样宏替换中的宏名也不可用引号括起来,如,
#define YES 1 printf(“YES”);
也不能进行宏替换。
9.2 文件包含文件包含是指一个源文件可以将另一个源文件的的整个内容包含进来。
文件包含的格式:
#include <文件名 >
系统只到存放 C库函数头文件所在的目录中寻找要包含的文件,成为标准方式。
#include,文件名,
系统首先在用户当前目录中检索,若没找到,
则按标准方式检索。
例 文件包含举例 /* powers.h */#define sqr(x) ((x)*(x))
#define cube(x) ((x)*(x)*(x))
#define quad(x) ((x)*(x)*(x)*(x))
/*ch8_10.c*/
#include <stdio.h>
#include "d:\zhou\powers.h"
#define MAX_POWER 10
void main()
{ int n;
printf("number\t exp2\t exp3\t exp4\n");
printf("----\t----\t-----\t------\n");
for(n=1;n<=MAX_POWER;n++)
printf("%2d\t %3d\t %4d\t %5d\n",n,sqr(n),cube(n),quad(n));
}
9.2 文件包含