通常的编译(包括词法分析、语法分析、代码生成、代码优化)之前,先对这些命令进 行预处理,然后将预处理的结果和源程序一起再进行通常的编译处理,以得到目标代码 (oBJ文件)。 C提供的编译预处理命令 宏命令( Macro) 文件包含命令( include) 条件编译命令 这些命令均以#开头,以区别于语句。 宏( Macro) 、不带参数的宏 般形式:# define标识符字符串 如:# define p31415926 作用:用标识符(称为“宏名”)P代替字符串“31415926” 在预编译时,将源程序中出现的宏名P替换为字符串“31415926”,这一替换过程称为“宏 展开”。 # define:宏定义命令 fd终止宏定义命令
编译预处理:在源程序文件中,加入“编译预处理命令”,使编译程序在对源程序进行 通常的编译(包括词法分析、语法分析、代码生成、代码优化)之前,先对这些命令进 行预处理,然后将预处理的结果和源程序一起再进行通常的编译处理,以得到目标代码 (OBJ文件)。 C提供的编译预处理命令 宏命令(Macro) 文件包含命令(include) 条件编译命令 这些命令均以#开头,以区别于语句。 宏(Macro) 一、不带参数的宏 一般形式:#define 标识符字符串 如: #define PI 3.1415926 作用:用标识符(称为“宏名”)PI代替字符串“3.1415926”。 在预编译时,将源程序中出现的宏名PI替换为字符串“3.1415926” ,这一替换过程称为“宏 展开”。 #define:宏定义命令 #undef:终止宏定义命令
#define Pl3. 1415926 main( float ls,r,v: printf(" input radius: B scanf("%f",&r);/*输入圆的半径* 1=20*P*r;/*圆周长* s=P*r*r;/*圆面积* V=40/30*P*r*r*r;/*球体积* printf(" 1=%104f\ns=%104f\nv=%104f\n",L, s, v); 关于宏定义的说明:
[例] #define PI 3.1415926 main() { float l,s,r,v; printf("input radius:"); scanf("%f",&r); /* 输入圆的半径*/ l = 2.0*PI*r; /* 圆周长*/ s = PI*r*r; /* 圆面积 */ v = 4.0/3.0*PI*r*r*r; /* 球体积 */ printf("l=%10.4f\ns=%10.4f\nv=%10.4f\n",l,s,v); } 关于宏定义的说明:
般去名用大写字母表示。(变量名一般用小写字母) 2、使用宏可以提高程序的可读性和可移植性。如上述程序中,多处需要使用π 值,用宏名既便于修改又意义明确 3、宏定义是用宏名代替字符串,宏扩展时仅作简单替换,不检查语法。语法检 查在编译时进行。 4、宏定义不是C语句,后面不能有分号。如果加入分号,则连分号一起替换。 #define pl 3. 1415926 area= p*rr: 在宏扩展后成为: area=31315926;*r*r; 结果,在编译时出现语法错误。 5、通常把# define命令放在一个文件的开头,使其在本文件全部有效。(# define 定义的宏仅在本文件有效,在其它文件中无效,这与全局变量不同)。 6、宏定义终止命令unde结束先前定义的宏名
1、一般宏名用大写字母表示。(变量名一般用小写字母)。 2、使用宏可以提高程序的可读性和可移植性。如上述程序中,多处需要使用π 值,用宏名既便于修改又意义明确。 3、宏定义是用宏名代替字符串,宏扩展时仅作简单替换,不检查语法。语法检 查在编译时进行。 4、宏定义不是C语句,后面不能有分号。如果加入分号,则连分号一起替换。 如: #define PI 3.1415926; area = P*r*r; 在宏扩展后成为: area = 3.1315926;*r*r; 结果,在编译时出现语法错误。 5、通常把#define命令放在一个文件的开头,使其在本文件全部有效。(#define 定义的宏仅在本文件有效,在其它文件中无效,这与全局变量不同)。 6、宏定义终止命令#undef结束先前定义的宏名
define g 9. 8 需 # undef g/*取消G的意义*/ f10 7、宏定义中可以引用已定义的宏名。 例82] #definer.0 #define pl3. 1415926 #deinfe l Pi*r #define s pi rr maino printf("L=%f\ns=%f\n", L, S
#define G 9.8 main() { } #undef G /* 取消G的意义 */ f1() ┆ 7、宏定义中可以引用已定义的宏名。 [例8.2] #define R 3.0 #define PI 3.1415926 #deinfe L 2*PI*R #define S PI*R*R main() { printf("L=%f\nS=%f\n",L,S); }
8对程序中用双引号括起来的字符串,即使与宏名相同,也不替换。例如上例 的 printi语句中,双引号括起来L和S不被替换。 二、带参数的宏 般形式: # define宏名(参数表)字符串 带参数的宏在展开时,不是进行简单的字符串替换,而是进行参数替换。例、 #define s(a,b) 其中*保留 area=S(3,2)得3w2
8、对程序中用双引号括起来的字符串,即使与宏名相同,也不替换。例如上例 的printf语句中,双引号括起来L和S不被替换。 二、带参数的宏 一般形式: #define 宏名(参数表)字符串 带参数的宏在展开时,不是进行简单的字符串替换,而是进行参数替换。例