第8章 编译预处理 编译预处理是指,编译时,首先对编译预处理命 令进行处理,然后再将预处理后的中间结果进行编译, 以得到目标代码。 教学目的: 掌握#define、#include的用法和用途; 了解条件编译的用途。 2024/10/28
2024/10/28 1 第8章 编译预处理 编译预处理是指,编译时,首先对编译预处理命 令进行处理,然后再将预处理后的中间结果进行编译, 以得到目标代码。 教学目的: 掌握#define、#include的用法和用途; 了解条件编译的用途
教学内容: 8.1*宏定义与符号常量 8.2*文件包含 8.3条件编译 本章要点 本章作业与上机实践 2024/10/28 2
2024/10/28 2 教学内容: 8.1* 宏定义与符号常量 8.2* 文件包含 8.3 条件编译 本章要点 本章作业与上机实践
8.1*宏定义与符号常量 在进行文本编辑时,“替换”是一个很有用的功 能。C语言编译预处理程序也提供类似的功能: 在源程序中,允许用一个标识符(称为宏名)来 表示一个语言符号字符串;编译预处理时,用“语言 符号字符串”替换所有“宏名”。 在C语言中,“宏”分为无参数的宏(简称无参 宏)和有参数的宏(简称有参宏)两种。 2024/10/28 3
2024/10/28 3 8.1* 宏定义与符号常量 在进行文本编辑时,“替换”是一个很有用的功 能。C语言编译预处理程序也提供类似的功能: 在源程序中,允许用一个标识符(称为宏名)来 表示一个语言符号字符串;编译预处理时,用“语言 符号字符串”替换所有“宏名”。 在C语言中,“宏”分为无参数的宏(简称无参 宏)和有参数的宏(简称有参宏)两种
8.1.1无参宏 1.定义 宏定义命令 #define宏名字符串 遵循标识符命名规则 常数、表达式、格式串等 2。预处理操作一 宏展开:用字符串替换所有 宏名。 2024/10/28 4
2024/10/28 4 8.1.1 无参宏 1.定义 #define 宏名 字符串 2.预处理操作——宏展开:用字符串替换所有 宏名。 宏定义命令 遵循标识符命名规则 常数、表达式、格式串等
「案例8.1]输入圆的半径,求圆的周长、面积和 球的体积。要求:使用无参宏定义圆周率。 2024/10/28 5
2024/10/28 5 [案例8.1] 输入圆的半径,求圆的周长、面积和 球的体积。要求:使用无参宏定义圆周率
宏名 #define PI 3.1415926 #include "stdio.h" 用来替换宏名的常数 #include "conio.h” void mainO float radius,length,area,volume; printf"Input a radius:") scanf"%f,&cradius为 引用无参宏 length=2*PI *radius; area=PI *radius*radius; volume=PI *radius*radius*radius*4/3; printf("length=%.2f area=%.2f volume=%.2fn", length,area,volume); getch(); 2024/10/28 6
2024/10/28 6 #define PI 3.1415926 #include “stdio.h” #include “conio.h” 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*4/3; printf("length=%.2f,area=%.2f,volume=%.2f\n", length, area, volume); getch(); } 宏名 用来替换宏名的常数 引用无参宏
宏展开后的结果如下: . void main() { 宏名被字符串替换 length=2*3.1415926*radius; area =3.1415926 *radius*radius; volume=3.1415926*radius*radius*radius*4/3; 2024/10/28 7
2024/10/28 7 宏展开后的结果如下: . void main() { . length = 2* 3.1415926 *radius; area = 3.1415926 *radius*radius; volume = 3.1415926 *radius*radius*radius*4/3; . } 宏名被字符串替换
3.使用宏定义的优点 (1)可提高源程序的可维护性。 在案例8.1中,如果圆周率只需要保留2位小数, 则仅修改宏定义1处即可。 如果直接使用圆周率,而不是宏定义,则需要修 改3处;且随着引用次数的增加而增加。 2024/10/28 8
2024/10/28 8 3.使用宏定义的优点 (1)可提高源程序的可维护性。 在[案例8.1]中,如果圆周率只需要保留2位小数, 则仅修改宏定义1处即可。 如果直接使用圆周率,而不是宏定义,则需要修 改3处;且随着引用次数的增加而增加
(2)可提高源程序的可移植性。 程序中有时需要使用一些与系统有关的常量,例 如int型数据占用的内存字节数。 这时,可利用宏定义“#define INT SIZE16将 该内存字节数从程序中分离出来。 一旦需要移植到32位机上运行,只需将上述宏定 义中的“16”改为“32”,然后重新编译、连接即可。 2024/10/28 9
2024/10/28 9 (2)可提高源程序的可移植性。 程序中有时需要使用一些与系统有关的常量,例 如int型数据占用的内存字节数。 这时,可利用宏定义“#define INT_SIZE 16 ”将 该内存字节数从程序中分离出来。 一旦需要移植到32位机上运行,只需将上述宏定 义中的“16”改为“32”,然后重新编译、连接即可
4.说明 ()宏定义不是C语句,所以行尾不能加分号。 否则,宏展开时,会将分号作为字符串的1个字 符,用于替换宏名。 例如:#define PI3.1415926; 编译器提示 length =2 PI radius: 出错的位置 宏展开 length =2 3.1415926;radius 2024/10/28 10
2024/10/28 10 4.说明 (1)* 宏定义不是C语句,所以行尾不能加分号。 否则,宏展开时,会将分号作为字符串的1个字 符,用于替换宏名。 例如:#define PI 3.1415926 ; . length = 2 * PI * radius; length = 2 * 3.1415926 ; * radius ; 宏 展 开 编译器提示 出错的位置