清华大学出版社 TSINGHUA UNIVERSITY PRESS §9.1宏定义 91.1不带参数的宏定义 宏定义一般# define标识符字符串 形式为:例如:# define pi31415926 宏定义的作用是在本程序文件中用指定的标识符PI 来代替“3.1415926这个字符串,在编译预处理时 ,将程序中在该命令以后出现的所有的P都用 3.1415926”代替。这种方法使用户能以一个简单 的名字代替个长的字符串 这个标识符(名字)称为“宏名 在预编译时将宏名替换成字符串的过程称为“宏展 开”。# define是宏定义命令 6
6 §9.1 宏定义 9.1.1 不带参数的宏定义 宏定义一般 形式为: #define 标识符 字符串 例如:# define PI 3.1415926 • 宏定义的作用是在本程序文件中用指定的标识符PI 来代替“3.1415926”这个字符串,在编译预处理时 ,将程序中在该命令以后出现的所有的PI都用 “3.1415926”代替。这种方法使用户能以一个简单 的名字代替一个长的字符串. • 这个标识符(名字)称为“宏名” • 在预编译时将宏名替换成字符串的过程称为“宏展 开” 。#define是宏定义命令
清华大学出版社 TSINGHUA UNIVERSITY PRESS 例9.1使用不带参数的宏定义 #include <stdio.h> #define pi 3. 1415926 void maino float l,s, rV printf("input radius: ) scanf("%f &r) l=2.0*PIr; s=PIror. v=4.0/3*Pir*r*r printf(l=%104f\ns=%104fnv=%104f\n",L,S, v) 7
7 #include <stdio.h> #define PI 3.1415926 void 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*PI*r*r*r; printf("l=%10.4f\ns=%10.4f\nv=%10.4f\n",l,s,v); } 例9.1 使用不带参数的宏定义
清华大学出版社 TSING 运行情况如下: 1=25.1328 s=50.2655 input radius:4K 说明: V=150.7966 (1)宏名一般习惯用大写字母表示,以便与变量名相 区别。但这并非规定,也可用小写字母。 (2)使用宏名代替一个字符串,可以减少程序中重复 书写某些字符串的工作量。 (3)宏定义是用宏名代替一个字符串,只作简单置换 ,不作正确性检查。只有在编译已被宏展开后的 源程序时才会发现语法错误并报错。 8
8 input radius: 4↙ 运行情况如下: 1=25.1328 s=50.2655 v=150.7966 (1) 宏名一般习惯用大写字母表示,以便与变量名相 区别。但这并非规定,也可用小写字母。 (2) 使用宏名代替一个字符串,可以减少程序中重复 书写某些字符串的工作量。 (3) 宏定义是用宏名代替一个字符串,只作简单置换 ,不作正确性检查。只有在编译已被宏展开后的 源程序时才会发现语法错误并报错。 说明:
清华大学出版社 TSINGHUA UNIVERSITY PRESS 说明: (4)宏定义不是C语句,不必在行未加分号。如果加 了分号则会连分号一起进行置换。 (5)# define命令出现在程序中函数的外面,宏名 的有效范围为定义命令之后到本源文件结束。通 常,# define命令写在文件开头,函数之前,作 为文件一部分,在此文件范围内有效。 (6)可以用# undef命令终止宏定义的作用域。 例如 9
9 (4) 宏定义不是C语句,不必在行末加分号。如果加 了分号则会连分号一起进行置换。 (5) #define命令出现在程序中函数的外面,宏名 的有效范围为定义命令之后到本源文件结束。通 常,#define命令写在文件开头,函数之前,作 为文件一部分,在此文件范围内有效。 (6) 可以用#undef命令终止宏定义的作用域。 例如: 说明:
清华大学出版社 TSINGHUA UNIVERSITY PRESS #define g 9.8 void maino G的有效范围 #undef g f10 在f1函数中,G不再代表 9.8。这样可以灵活控制宏 定义的作用范围。 10
10 #define G 9.8 _______ void main() ↑ { G的有效范围 … } -----↓---- #undef G f1() { … } 在f1函数中,G不再代表 9.8。这样可以灵活控制宏 定义的作用范围