〔语言序设计 第九章编译预处理 任课老师:台安
第九章 编译预处理 任课老师:台安
编译预处理概念 编译:对源程序的说明和执行部分进行词法、语法分 析,生成代码,优化等。 编译预处理:在源程序文件中,加入“编译预处理命令′ 使编译程序在对源程序进行通常的编译之前,先对这些命 令进行预处理,然后将预处理的结果和源程序一起再进行 通常的编译处理,以得到目标代码(OBJ文件)。 C提供的编译预处理命令 宏命令( define) 文件包含命令( Include 条件编译命令 这些命令均以#开头,以区别于语句 上一页下一页 返回
上一页 下一页 返回 第九章 编译预处理 编译预处理概念 ❖编译:对源程序的说明和执行部分进行词法、语法分 析,生成代码,优化等。 ❖编译预处理:在源程序文件中,加入“编译预处理命令” , 使编译程序在对源程序进行通常的编译之前,先对这些命 令进行预处理,然后将预处理的结果和源程序一起再进行 通常的编译处理,以得到目标代码(OBJ文件)。 ❖C提供的编译预处理命令 ❖ 宏命令(define) ❖ 文件包含命令(include) ❖ 条件编译命令 ❖ 这些命令均以#开头,以区别于语句
第九章编译预处理 9.1宏定义 令9.1.1不带参数的宏定义 9.1.2带参数的宏定义 92“文件包含”处理 93条件编译 上一页下一页 返回
上一页 下一页 返回 第九章 编译预处理 第九章 编译预处理 ❖ 9.1 宏定义 ❖ 9.1.1 不带参数的宏定义 ❖ 9.1.2 带参数的宏定义 ❖ 9.2 “文件包含”处理 ❖ 9.3 条件编译
91宏定义 不带参数的宏 令一般形式:# define标识符字符串 tH: #define Pi 3. 1415926 作用:用标识符(称为“宏名”)P代 替字符串“3.1415926”。 在预编译时,将源程序中出现的宏名PI 替换为字符串“3.1415926” ,这一替换过 程称为“宏展开” 令# define:宏定义命令 上一页下一页 返回
上一页 下一页 返回 第九章 编译预处理 9.1 宏定义 ❖ 一、不带参数的宏 ❖ 一般形式: #define 标识符 字符串 ❖ 如: #define PI 3.1415926 ❖ 作用:用标识符(称为“宏名”)PI代 替字符串“3.1415926”。 ❖ 在预编译时,将源程序中出现的宏名PI 替换为字符串“3.1415926” ,这一替换过 程称为“宏展开”。 ❖ #define:宏定义命令
例91:宏定义 #define pi 3. 14159 main i float l,r,s Scan(f”,&r);“输入圆的半径 l=r*2.0*PI;圆周长 S=r*r米PI;圆面积 V=4.0/3.0*r*rr*PI;产球体积啊 printf(1=o of ns=oofnv=%fn,l,S,v) 上一页下一页 返回
上一页 下一页 返回 第九章 编译预处理 例9.1:宏定义 #define PI 3.14159 main( ) { float l, r, s, v; scanf(“%f”,&r); /* 输入圆的半径*/ l= r *2.0* PI; /* 圆周长*/ s=r*r*PI; /* 圆面积 */ v=4.0/3.0*r*r*r*PI; /* 球体积 */ printf(“l=%f\ ns=%f\nv=%f\n”,l, s,v); }
关于宏定义的说明: 令1、一般宏名用大写字母表示。(变量名一般用小写字母) 2、使用宏可以提高程序的可读性和可移植性。如上述程序中, 多处需要使用π值,用宏名既便于修改又意乂明确 3、宏定义是用宏名代替字符串,宏扩展时仅作简单替换,不检 查语法。语法检查在编译时进行。 令4、宏定义不是C语句,后面不能有分号。如果加入分号,则连分 号一起替换。 如 .#define pi3. 14 15926 o area= Pr 在宏扩展后成为 area=3.1315926;*r*r 结果,在编译时出现语法错误。 上一页下一页 返回
上一页 下一页 返回 第九章 编译预处理 关于宏定义的说明: ❖ 1、一般宏名用大写字母表示。(变量名一般用小写字母)。 ❖ 2、使用宏可以提高程序的可读性和可移植性。如上述程序中, 多处需要使用π值,用宏名既便于修改又意义明确。 ❖ 3、宏定义是用宏名代替字符串,宏扩展时仅作简单替换,不检 查语法。语法检查在编译时进行。 ❖ 4、宏定义不是C语句,后面不能有分号。如果加入分号,则连分 号一起替换。 ❖ 如: ❖ #define PI 3.1415926; ❖ area = PI*r*r; ❖ 在宏扩展后成为: ❖ area = 3.1315926;*r*r; ❖ 结果,在编译时出现语法错误
关于宏定义的说明: 5、通常把#defi命令放在一个文件的开头,使其在本 文件全部有效。 6、宏定义终止命令#mde结束先前定义的宏名。 令# define g9.8 今main() # under/取消G的意义 今1() 上一页下一页 返回
上一页 下一页 返回 第九章 编译预处理 关于宏定义的说明: ❖ 5、通常把#define命令放在一个文件的开头,使其在本 文件全部有效。 ❖ 6、宏定义终止命令 #undef结束先前定义的宏名。 ❖ #define G 9.8 ❖ main( ) ❖ { ❖ } ❖ #undef G /* 取消G的意义*/ ❖ f1( ) ❖ { ❖ ┆ ❖ }
例92宏代换 #define f x+ main() int x=4, y=5 if(x ++<y z=2*f else z=f/2 printf("n%od,z) 结果请选择: (A)20(B)15(C)18()4 上一页下一页 返回
上一页 下一页 返回 第九章 编译预处理 例9.2 宏代换 #define f x+y main( ) { int x=4, y=5, z; if(x ++ < y) z=2*f; else z=f / 2; printf(“\n%d”,z); } 结果请选择: (A)20 (B) 15 (C) 18 (D) 4
带参数的宏 一般形式 # define宏名(参数表)字符串 令带参数的宏在展开时,不是进行简单的 字符串替换,而是进行参数替换。例、 #define S(a,b)a 其中*保留 area=S(3,2)得3#2 上一页下一页 返回
上一页 下一页 返回 第九章 编译预处理 二、带参数的宏 ❖ 一般形式: ❖ #define 宏名(参数表) 字符串 ❖ 带参数的宏在展开时,不是进行简单的 字符串替换,而是进行参数替换。例
[例93带参数的宏 #define pi 3. 1415926 #define s(r) pirr main float a, area, a=3.6 area=S(a); printf(r%ofnarea=%ofn", a, area) 上一页下一页 返回
上一页 下一页 返回 第九章 编译预处理 [例9.3] 带参数的宏 #define PI 3.1415926 #define S(r) PI*r*r main( ) { float a, area; a = 3.6; area = S(a); printf("r=%f\narea=%f\n",a,area); }