
编译预玫处理 ●●● > 所谓预处理是指,在对源程序进行编译之前 先对源程序中的预处理命令(主要指宏定义命 令、文件包含命令和条件编译命令)进行处理; 然后再将处理的结果,和源程序一起进行编译 以得到目标代码。 >文件包含(#include)和宏定义(#define)都是 编译预处理指令 ·在形式上都以“#开头,不属于C语言中真正的语 句 ·增强了C语言的编程功能,改进C语言程序设计环 高扁程交近 目标要求 为容 课后作业 退出
目标要求 讲课提纲 讲课内容 课后作业 退出 ➢ 所谓预处理是指,在对源程序进行编译之前, 先对源程序中的预处理命令(主要指宏定义命 令、文件包含命令和条件编译命令)进行处理; 然后再将处理的结果,和源程序一起进行编译, 以得到目标代码。 ➢ 文件包含(#include)和宏定义(#define)都是 编译预处理指令 ▪ 在形式上都以“#”开头,不属于C语言中真正的语 句 ▪ 增强了C语言的编程功能,改进C语言程序设计环 境,提高编程效率 编译预处理

编译预处理功能 编译预处理的主要功能 define > 编译预处迅 #include 文件包含(include) 宏定义(#define 编译 宏定义 ·条件编译 文件包含 连接 条件编译 执行 目标要求 讲课提纲 讲课内容 课后作业 K 退出
目标要求 讲课提纲 讲课内容 课后作业 退出 ➢ 编译预处理的主要功能: ▪ 文件包含(#include) ▪ 宏定义(#define) ▪ 条件编译 编译预处理功能 宏定义 文件包含 条件编译 编译预处理 编译 连接 执行 #define #include

●● 宏定义 (一)不带参数的宏定义 (二)带参数宏定义 目标要求 讲课提纲 (讲课内容 课后作业 K 退出
目标要求 讲课提纲 讲课内容 课后作业 退出 宏定义 (一)不带参数的宏定义 (二)带参数宏定义

(一)不带参数的宏定义(简单替换) 用标识符来代表一个字符串。C语言用 概念 “#define'”进行宏定义。C编译系统在编译 前将这些标识符替换成所定义的字符串。 格式 define 标识符 字符串 #define PI 3.1415926 宏名: 宏定义中的标识符称为“宏名” 相关 概念 宏调用:在程序中用宏名替代字符串称为“宏调 用”。 宏展开:在预编译时将宏名替换成字符串的过程称 “宏展开” 目标要求 讲课提纲 讲课内容 课后作业 退出
目标要求 讲课提纲 讲课内容 课后作业 退出 用标识符来代表一个字符串。C语言用 “#define”进行宏定义。C编译系统在编译 前将这些标识符替换成所定义的字符串。 概念 格式 #define 标识符 字符串 相关 概念 宏名: 宏定义中的标识符称为“宏名”。 宏调用:在程序中用宏名替代字符串称为“宏调 用”。 宏展开:在预编译时将宏名替换成字符串的过程称 “宏展开”。 #define PI 3.1415926 (一)不带参数的宏定义(简单替换)

输入圆的半径,求圆的周长、面积和球的体积。要求 ●●● ●● 使用无参宏定义圆周率。 #include #define PI 3.1415926 void main() 宏展开: length=2*3.1415926*radius; area= float radius,len 3.1415926*radius*radius; volume= printf("Input a 3.1415926*radius*radius*radius*3/4; scanf("%f',&radius)月 length=2*PI*radius; *宏调用,引用无参宏求周长*/ area=PI*radius*radius; /*宏调用,引用无参宏求面积*/ volume=-PI*radius*radius*radius*3/4;/*宏调用,引用无参宏求体积*/ printf("length=%.2farea=%.2f,volume=%.2fn", length, area, volume); 目标要求 讲课提纲 讲课内容 课后作业 退出
目标要求 讲课提纲 讲课内容 课后作业 退出 #include #define PI 3.1415926 void main() { float radius,length,area,volume; printf("Input a radius: "); scanf("%f",&radius); length=2*PI*radius; /*宏调用,引用无参宏求周长*/ area=PI*radius*radius; /*宏调用,引用无参宏求面积*/ volume=PI*radius*radius*radius*3/4; /*宏调用,引用无参宏求体积*/ printf("length=%.2f,area=%.2f,volume=%.2f\n", length, area, volume); } 例 1 输入圆的半径,求圆的周长、面积和球的体积。要求 使用无参宏定义圆周率。 宏展开: length=2*3.1415926*radius; area= 3.1415926*radius*radius; volume= 3.1415926*radius*radius*radius*3/4;

说明 1、宏名遵循标识符规定,习惯用大写字母表示, 以便区别普通的变量。 2、#define之间不留空格,宏名两侧空格分隔。 3、宏定义字符串不要以分号结束,否则分号也作 为字符串的一部分参加展开。从这点上看宏展开 实际上是简单的替换。 #define PI 3.14; 宏展开 area=PI*r*r; area=3.14;*r*r: 目标要求 讲课提纲 讲课内容 课后作业 退出
目标要求 讲课提纲 讲课内容 课后作业 退出 1、宏名遵循标识符规定,习惯用大写字母表示, 以便区别普通的变量。 2、#define之间不留空格,宏名两侧空格分隔。 3、宏定义字符串不要以分号结束,否则分号也作 为字符串的一部分参加展开。从这点上看宏展开 实际上是简单的替换。 说明 #define PI 3.14; area=PI*r*r; area=3.14;*r*r; 宏展开

● 说明 、 宏定义是预处理指令,与定义变量不同,它只 是进行简单的字符串替换,不分配内存。 5、宏定义用宏名代替一个字符串,并不管它的数 据类型是什么,也不管宏展开后的词法和语法的 正确性,只是简单的替换。是否正确,编译时由 编译器判断。 例如: #define PI 3.14 照样进行宏展开(替换),是否正确,由编译器 来判断。 目标要求 讲课提纲 讲课内容 课后作业 退出
目标要求 讲课提纲 讲课内容 课后作业 退出 4、宏定义是预处理指令,与定义变量不同,它只 是进行简单的字符串替换,不分配内存。 5、宏定义用宏名代替一个字符串,并不管它的数 据类型是什么,也不管宏展开后的词法和语法的 正确性,只是简单的替换。是否正确,编译时由 编译器判断。 例如: #define PI 3.I4 照样进行宏展开(替换),是否正确,由编译器 来判断。 说明

0● 说明 6、#define命令出现在程序中函数的外面,宏 名的有效范围从定义命令开始直到本源程序文件 结束。可以通过#undef终止宏名的作用域。 #define G 9.8 #define PI 3.14 int f10 G的有 效范围 。00.0 #undef G P的有 void mainO 效范围 目标要求 讲课提纲 讲课内容 课后作业 退出
目标要求 讲课提纲 讲课内容 课后作业 退出 6、#define命令出现在程序中函数的外面,宏 名的有效范围从定义命令开始直到本源程序文件 结束。可以通过#undef终止宏名的作用域。 说明 #define G 9.8 #define PI 3.14 int f1() { . . } #undef G void main() { . . } G的有 效范围 PI的有 效范围

说明 ●●●● ●● 賀用肥圣泰暴霞亵葺 宏名出现在双引停 括起采的字符串中时,将不会产生 宏替换。 #define R 3.0 #define PI 3.14 #define L 2*PI*R #define S PI*R*R void main() printf(“L=%fnS=y%fn”,L,S) 宏展开 printf(“L=%fnS=%fn”,2*3.14*3.0,3.14*3.0*3.0); 目标要求 讲课提纲 讲课内容 课后作业 退出
目标要求 讲课提纲 讲课内容 课后作业 退出 7、宏定义时,可以引用已定义的宏名,可以层层置换。若 宏名出现在双引号“”括起来的字符串中时,将不会产生 宏替换。 说明 #define R 3.0 #define PI 3.14 #define L 2*PI*R #define S PI*R*R void main() { printf(“L=%f\nS=%f\n”,L,S); } 宏展开 printf(“L=%f\nS=%f\n”,2*3.14*3.0 , 3.14*3.0*3.0);

(二)带参数的宏定义 概念 带参数的宏定义不只是进行简单的字符串替 换,还要进行参数替换。 类似函数头,但是没 有类型说明,参数也 格式 define 宏名(参数表 字符 不要类型说明 展开置 按照#define命令行中指定的“字符串”从左到 换规则 右进行置换(扫描置换)。如果串中包含宏定义 中的形参,则将程序中相应的实参代替形参,其 它字符原样保留,形成了替换后的字符串。 举例 #define S(a,b)a*b 宏展开 area=S(3,2); area=3*2; 目标要求 讲课提纲 讲课内容 课后作业 退出
目标要求 讲课提纲 讲课内容 课后作业 退出 (二)带参数的宏定义 带参数的宏定义不只是进行简单的字符串替 换,还要进行参数替换。 格式 概念 #define 宏名(参数表) 字符串 类似函数头,但是没 有类型说明,参数也 不要类型说明 展开置 换规则 按照#define命令行中指定的“字符串”从左到 右进行置换(扫描置换)。如果串中包含宏定义 中的形参,则将程序中相应的实参代替形参,其 它字符原样保留,形成了替换后的字符串。 举例 #define S(a,b) a*b area=S(3,2); 宏展开 area=3*2;