
C语言程序设计 赵晓阳
赵晓阳

第8章编译预处理 ·81宏定义 ·8.2文件包含 ·83条件编译
第8章 编译预处理 8.1 宏定义 8.2 文件包含 8.3 条件编译

8.1宏定义 ·在C语言源程序中,允许用一个标识符来表示一个字符串,称为宏。 被定义为宏的标识符称为宏名。在编译预处理时,对程序中所有出现 的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或 “宏展开”。宏分为无参宏和带参宏。 ·1无参宏 ·无参宏的宏名后不带参数。其定义的一般形式为: ·#define标识符字符串 其中“#define'”表示这是一条宏定义预处理命令,“标识符”是所定 义的宏名,“字符串”可以是常量、表达式和格式串等。 下一页返回
8.1 宏定义 在C语言源程序中,允许用一个标识符来表示一个字符串,称为宏。 被定义为宏的标识符称为宏名。在编译预处理时,对程序中所有出现 的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或 “宏展开”。宏分为无参宏和带参宏。 1.无参宏 无参宏的宏名后不带参数。其定义的一般形式为: #define 标识符 字符串 其中“#define”表示这是一条宏定义预处理命令,“标识符”是所定 义的宏名,“字符串”可以是常量、表达式和格式串等。 下一页 返回

8.1宏定义 ·例8-1给定圆锥的底圆半径R和高H,求圆锥的体积。 ·#define PI3.14159 ·#define R5 ·#define H6 .#define CVP volume of cone is: ·main() ●{float v; 。V=PI*R*R*H/3.O; ·printf("%s%f\n",cvp,v)方 。} 上一页下一页返回
8.1 宏定义 例8-1 给定圆锥的底圆半径R和高H,求圆锥的体积。 #define PI 3.14159 #define R 5 #define H 6 #define CVP ″volume of cone is:″ main( ) { float v; v=PI*R*R*H/3.0; printf (″%s %f\n″, cvp, v); } 上一页 下一页 返回

8.1宏定义 ·运行结果: volume of cone is:157.079500 ·说明: ·①宏定义是用宏名来表示一个字符串,在宏展开时则以该字符串代换 宏名,这只是一种简单的替换。字符串中可含任何字符,预处理程序 对它不作任何检查。若有错误,只能在编译已被宏展开后的源程序时 发现。 ·②宏定义不是说明或语句,在末尾不应加分号,否则连分号也一起代 换。 上一页下一页返回
8.1 宏定义 运行结果: volume of cone is: 157.079500 说明: ①宏定义是用宏名来表示一个字符串,在宏展开时则以该字符串代换 宏名,这只是一种简单的替换。字符串中可含任何字符,预处理程序 对它不作任何检查。若有错误,只能在编译已被宏展开后的源程序时 发现。 ②宏定义不是说明或语句,在末尾不应加分号,否则连分号也一起代 换。 上一页 下一页 返回

8.1宏定义 。③宏定义必须写在函数之外,其作用域为从宏定义命令开始到源程序 结束。如要终止其作用域可使用预处理命令undef。 ·④宏名习惯上用大写字母表示,以便与变量相区别。但也允许使用小 写字母。 ·⑤宏名在源程序中若用双引号括起来,则预处理程序不对其作宏代换。 例如: ·#define PI3.14159 。main() ·{ ·printf("PI")方printf("\n")月 ● 上一页下一页返回
8.1 宏定义 ③宏定义必须写在函数之外,其作用域为从宏定义命令开始到源程序 结束。如要终止其作用域可使用预处理命令#undef。 ④宏名习惯上用大写字母表示,以便与变量相区别。但也允许使用小 写字母。 ⑤宏名在源程序中若用双引号括起来,则预处理程序不对其作宏代换。 例如: #define PI 3.14159 main( ) { printf(″PI″); printf(″\n″); } 上一页 下一页 返回

8.1宏定义 ·则运行结果为: ●PI ·这里把“P”作为字符串处理,因此不作宏代换。 ·⑥宏定义允许嵌套。 ·在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理 程序将作层层代换。例如: ·#define WIDTH8o .#define LENGTH(WIDTH+40) ·其中,第2个宏定义中使用了第1个宏定义中的宏名WIDTH。在执行 编译处理时,将程序中的所有WIDTH都被8o代换,而所有的 LENGTH都被(8o+4o)代换。 上一页下一页返回
8.1 宏定义 则运行结果为: PI 这里把“PI”作为字符串处理,因此不作宏代换。 ⑥宏定义允许嵌套。 在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理 程序将作层层代换。例如: #define WIDTH 80 #define LENGTH (WIDTH+40) 其中,第2个宏定义中使用了第1个宏定义中的宏名WIDTH。在执行 编译处理时,将程序中的所有WIDTH都被80代换,而所有的 LENGTH都被(80+40)代换。 上一页 下一页 返回

8.1宏定义 ·(☑)可用宏定义表示数据类型。 ·例如:#define REAL float ·这时可用REAL作单精度实型变量的说明: ·REAL e,f; ·2.带参宏 ·C语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用 中的参数称为实际参数。对带参的宏,在调用中,不仅要宏展开,而 且要用实参去代换形参。实参可以是表达式。 ·带参宏定义的一般形式为: ·#define宏名(形式参数表)字符串 上一页下一页返回
8.1 宏定义 (7)可用宏定义表示数据类型。 例如:#define REAL float 这时可用REAL作单精度实型变量的说明: REAL e, f; 2.带参宏 C语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用 中的参数称为实际参数。对带参的宏,在调用中,不仅要宏展开,而 且要用实参去代换形参。实参可以是表达式。 带参宏定义的一般形式为: #define 宏名(形式参数表) 字符串 上一页 下一页 返回

8.1宏定义 ·带参宏调用的一般形式为: ·宏名(实际参数表): ·例如: #define POWER(x)(x)*(x) ·#define VOLUME(r,h) ·314159*(r)*(r)*(h)/3.0 ·假设x=4;y=6;r=3;h=5; ·z=POWER(x+y: ·V=VOLUME(r+2,h+1); 上一页下一页返回
8.1 宏定义 带参宏调用的一般形式为: 宏名(实际参数表); 例如: #define POWER(x) (x)*(x) #define VOLUME(r,h) 3.14159*(r)*(r)*(h)/3.0 假设x=4; y=6; r=3; h=5; z=POWER(x+y); v=VOLUME(r+2, h+1); 上一页 下一页 返回

8.1宏定义 ·则经编译预处理宏展开后为: ·z=(x+y)*(x+y); ·V=31459*(r+2)*(r+2)*(h+1)/3.0; ·说明: ·①带参宏定义中,宏名与形参表之间不能有空格。 ·例如:将带参宏定义 .#define POWER(x)(x)*(x) ·改写成:#define POWER(x)(x)*(x) 上一页下一页返回
8.1 宏定义 则经编译预处理宏展开后为: z=(x+y)*(x+y); v=3.14159*(r+2)*(r+2)*(h+1)/3.0; 说明: ①带参宏定义中,宏名与形参表之间不能有空格。 例如:将带参宏定义 #define POWER(x) (x)*(x) 改写成:#define POWER (x) (x)*(x) 上一页 下一页 返回