C 语言程序设计精品课 《C语言程序设计》 课程讲义 荆程 第8章预处理命令 2006年4月 技术系
第8章 预处理命令 《C语言程序设计》 课程讲义 2006年4月
C 上一章节课程回顾 语言程序设计精品课 函数定义的一般形式 函数的参数和函数的值 函数的调用 荆程 函数的嵌套调用 函数的递归调用 数组作为函数参数 局部变量和全局变量 技术系 变量的存储类别
上一章节课程回顾 函数定义的一般形式 函数的参数和函数的值 函数的调用 函数的嵌套调用 函数的递归调用 数组作为函数参数 局部变量和全局变量 变量的存储类别
C 第8章预处理命令 语言程序设计精品课 8.1 概述 8.2 宏定义 8.3 文件包含 荆程 8.4 条件编译 技术系
第8章 预处理命令 8.1 概述 8.2 宏定义 8.3 文件包含 8.4 条件编译
C 8.1概述 语言程序设计精品课 设编译预处理:在源程序文件中,加入“编译预处理命 令”,使编译程序在对源程序进行通常的编译(包 括词法分析、语法分析、代码生成、代码优化)之 前,先对这些命令进行预处理,然后将预处理的结 果和源程序一起再进行通常的编译处理,以得到目 标代码(OBJ文件)。 荆程 C提供的编译预处理命令 宏命令( Macro) 文件包含命令( include) 条件编译命令 技术系 这些命令均以#开头,以区别于语句
8.1概述 编译预处理:在源程序文件中,加入“编译预处理命 令”,使编译程序在对源程序进行通常的编译(包 括词法分析、语法分析、代码生成、代码优化)之 前,先对这些命令进行预处理,然后将预处理的结 果和源程序一起再进行通常的编译处理,以得到目 标代码(OBJ文件)。 C提供的编译预处理命令 宏命令(Macro) 文件包含命令(include) 条件编译命令 这些命令均以#开头,以区别于语句
C 语 82宏( Macro)定义 程 设 不带参数的宏 进一般形式:eine标识符字符串 精如:# define pl3.1415926 作用:用标识符(称为“宏名”)P代替字符串 “3.1415926” 在预编译时,将源程序中出现的宏名P替换为字符串 “3.1415926这一替换过程称为“宏展开” # define:宏定义命令 # undef:终止宏定义命令 技术系
8.2 宏(Macro)定义 一、不带参数的宏 一般形式:#define 标识符字符串 如: #define PI 3.1415926 作用:用标识符(称为“宏名”)PI代替字符串 “3.1415926” 。 在预编译时,将源程序中出现的宏名PI替换为字符串 “3.1415926” ,这一替换过程称为“宏展开” 。 #define:宏定义命令 #undef:终止宏定义命令
C 语【例 程 13.1415926 main( 设 计 float ls.rv: 精 printf("input radius: ) 课 scanf("%Fh/输入圆的半径 荆程1=20*P*;/,圆周长 s=P*r*r;/*圆面积* V=40/30*P*r*r*r;/*球体积*/ printf("1=%104f\ns=%104f\nv%104f\n",I,s,v; 技术系
[例] 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); }
C 语 关于宏定义的说明: 1、一般宏名用大写字母表示。(变量名一般用小写字母)。 2、彼里索以提高程字的可性和口移植件:知上述程序中,多处 设 计3、案定义是用室名焦营,宏扩展时仅作简单替换,不检查语 精4∴宏定义不是语句,后面不能有分号。如果加入分号,则连分号 课如 荆程# define pl31415926; area= P*r*r: 在宏扩展后成为: area=3.1315926;*r*r 结果,在编译时出现语法错误。 技术系
关于宏定义的说明: 1、一般宏名用大写字母表示。(变量名一般用小写字母)。 2、使用宏可以提高程序的可读性和可移植性。如上述程序中,多处 需要使用π值,用宏名既便于修改又意义明确。 3、宏定义是用宏名代替字符串,宏扩展时仅作简单替换,不检查语 法。语法检查在编译时进行。 4、宏定义不是C语句,后面不能有分号。如果加入分号,则连分号 一起替换。 如: #define PI 3.1415926; area = P*r*r; 在宏扩展后成为: area = 3.1315926;*r*r; 结果,在编译时出现语法错误
C 语 言5、通常把# define命令放在一个文件的开头,使其在本文件 程全部有效。(# define定义的宏仅在本文件有效,在其它文 序件中无效,这与全局变量不同)。 设 计6、宏定义终止命令抛nde结束先前定义的宏名 #define G8. 8 精品课一 main( 荆程{ 米# undef G/*取消G的意义* f10 技术系
5、通常把#define命令放在一个文件的开头,使其在本文件 全部有效。(#define定义的宏仅在本文件有效,在其它文 件中无效,这与全局变量不同)。 6、宏定义终止命令 #undef结束先前定义的宏名。 #define G 8.8 main() { } #undef G /* 取消G的意义 */ f1() ┆
C 7、宏定义中可以引用已定义的宏名。 语言程序设计精品课 例82] #definer.0 #define pl 3. 1415926 #deinfe l 2*Pi*r #define S Pi"R 荆程 printf("L=%f\nS=%f\n", L, S) 8、对程序中用双引号括起来的字符串,即使与宏名相 同,也不替换。例如上例的 printi语句中,双引号括起 来L和s不被替换。 技术系
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、对程序中用双引号括起来的字符串,即使与宏名相 同,也不替换。例如上例的printf语句中,双引号括起 来L和S不被替换
C 语 带参数的宏 程一般形式: 设ene宏名(参数表)字符串 计带参数的宏在展开时,不是进行简单的字符串替换,而是进行参数 替换。例、 精 课 荆程 #define S(a,b) ai 小↓其中保留 area=S(3,2)得3w2 技术系
二、带参数的宏 一般形式: #define 宏名(参数表)字符串 带参数的宏在展开时,不是进行简单的字符串替换,而是进行参数 替换。例