第8章编译预处理 所谓编译预处理是指,在对源程序进行编译之前,先 对源程序中的编译预处理命令进行处理;然后再将处理的 结果,和源程序一起进行编译,以得到目标代码 8.1宏定义与符号常量 8,2文件包含 8.3条件编译 [Return
第8章 编译预处理 所谓编译预处理是指,在对源程序进行编译之前,先 对源程序中的编译预处理命令进行处理;然后再将处理的 结果,和源程序一起进行编译,以得到目标代码。 8.1 宏定义与符号常量 8.2 文件包含 8.3 条件编译 [Return]
8.1宏定义与符号常量 在C语言中,“宏”分为无参数的宏(简称无参宏) 和有参数的宏(简称有参宏)两种 81.1无参宏定义 8.1.2符号常量 813有参宏定义 Return
8.1 宏定义与符号常量 在C语言中, “宏”分为无参数的宏(简称无参宏) 和有参数的宏(简称有参宏)两种。 8.1.1 无参宏定义 8.1.2 符号常量 8.1.3 有参宏定义 [Return]
8.1.1无参宏定义 1.无参宏定义的一般格式 # define标识符语言符号字符串 其中:“ define?为宏定义命令;“标识符”为所定义的宏名, 通常用大写字母表示,以便于与变量区别;“语言符号字符串”可 以是常数、表达式、格式串等。 2.使用宏定义的优点 (1)可提高源程序的可维护性 (2)可提高源程序的可移植性 (3)减少源程序中重复书写字符串的工作量
8.1.1 无参宏定义 1.无参宏定义的一般格式 #define 标识符 语言符号字符串 其中:“define”为宏定义命令;“标识符”为所定义的宏名, 通常用大写字母表示,以便于与变量区别;“语言符号字符串”可 以是常数、表达式、格式串等。 2.使用宏定义的优点 (1)可提高源程序的可维护性 (2)可提高源程序的可移植性 (3)减少源程序中重复书写字符串的工作量
[案例81输入圆的半径,求圆的周长、面积和球的体积。要求使用无参宏定义 圆周率。 /*案例代码文件名:AL81C* *程序功能:输入圆的半径,求圆的周长、面积和球的体积。* #define pi3.1415926 /*P是宏名,3.1415926用来替换宏名的常数*/ maino i float radius, length, area, volume printf("Input a radius: scanf("%of, &radius); length=2 Pi radius /*引用无参宏求周长* area=Pl*radius*radius /*引用无参宏求面积* volume=Piradius radius*radius*3/ 4 /*引用无参宏求体积* printf("length =%.2f, area=%.2f, volume=%/.2fn" length, area, volume) [程序演示]
[案例8.1] 输入圆的半径,求圆的周长、面积和球的体积。要求使用无参宏定义 圆周率。 /*案例代码文件名:AL8_1.C*/ /*程序功能:输入圆的半径,求圆的周长、面积和球的体积。 */ #define PI 3.1415926 /*PI是宏名,3.1415926用来替换宏名的常数*/ 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); } [程序演示]
3.说明 (1)宏名一般用大写字母表示,以示与变量区别。但这并非是规定。 (2)宏定义不是C语句,所以不能在行尾加分号。否则,宏展开时, 会将分号作为字符串的1个字符,用于替换宏名。 (3)在宏展开时,预处理程序仅以按宏定义简单替换宏名,而不作 任何检査。如果有错误,只能由编译程序在编译宏展开后的源程序时发 现。 (4)宏定义命令# define出现在函数的外部,宏名的有效范围是:从 定义命令之后,到本文件结束。通常,宏定义命令放在文件开头处。 (5)在进行宏定义时,可以引用已定义的宏名。 (6)对双引号括起来的字符串内的字符,即使与宏名同名,也不进 行宏展开。 Return
3.说明 (1)宏名一般用大写字母表示,以示与变量区别。但这并非是规定。 (2)宏定义不是C语句,所以不能在行尾加分号。否则,宏展开时, 会将分号作为字符串的1个字符,用于替换宏名。 (3)在宏展开时,预处理程序仅以按宏定义简单替换宏名,而不作 任何检查。如果有错误,只能由编译程序在编译宏展开后的源程序时发 现。 (4)宏定义命令#define出现在函数的外部,宏名的有效范围是:从 定义命令之后,到本文件结束。通常,宏定义命令放在文件开头处。 (5)在进行宏定义时,可以引用已定义的宏名。 (6)对双引号括起来的字符串内的字符,即使与宏名同名,也不进 行宏展开。 [Return]