第9章第1节 第九章预处理命令 预处理的概念 C程序的运行过程 source fille→ compile→ink→→ execute 源文件 编译 联接 运行 preprocessing 编译预处理 宏定义 宏定义命令 C提供的预处理功能了文件包含 文件包含命令 条件编译 条件编译命令
第9章第1节 ***预处理的概念*** C程序的运行过程 source file 源文件 compile 编译 link 联接 execute 运行 preprocessing 编译预处理 C提供的预处理功能 宏定义 文件包含 条件编译 宏定义命令 文件包含命令 条件编译命令
第9章第1节 §91宏定义 一.不代参数的宏定义 1.形式 # define标识符字符串 无分号 串字符 即宏名。命名规则与变量名相同, 习惯上用大写字母 2.作用用宏名代表一个字符串。 凡程序中出现宏名之处均用字符中替代——宏展开 define pl 3.1416 maint ain float ls, r, v; Float l,s, r, v; print“ input radius:”); printf("input radius:) scanf("%of, &r) 宏展开 scanf(“%f,&r); l=2.0*3.1416r l=2.0*PIr; s=3.1416*rr; s=PIRara v=4.0/3.0*Perrers V=3.0/4.0*3.1416r*r*r; prin tf“12s,v%,%f%fm”,s,v); prin ti(“4,s,v=%f%f,%fn”,,s,v);
第9章第1节 §9.1 宏 定 义 一. 不代参数的宏定义 1. 形式 # define 标识符 字符串 2. 作用 用宏名代表一个字符串。 凡程序中出现宏名之处均用字符中替代——宏展开 无分号 一串字符 即宏名。命名规则与变量名相同, 习惯上用大写字母 # define PI 3.1416 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.0*PI*r*r*r; prin tf(“l,s,v=%f,%f,%f\n”,l,s,v); } main() {float l,s,r,v; printf(“input radius:”); scanf(“%f”,&r); l=2.0*3.1416*r; s=3.1416*r*r; v=3.0/4.0*3.1416*r*r*r; prin tf(“l,s,v=%f,%f,%f\n”,l,s,v); } 宏展开
第9章第1节 3.有关问题的说明 1)宏展开时,字符串一→宏名。故可将一些常量定义为宏 #define n50 main( 宏展开main0 i int a N; f int a 50; 宏开时,不检查字符串的意义,应注意这些字符引起的问题 define pl3 1416 malI 宏展开 area=Pr*r area=3. 1416: *r*r: t define pi 3. 1416 define pi3 1416: main maino 宏展开 area=rr*PI: area=r*r*3,1416; 尚可
3. 有关问题的说明 1) 宏展开时,字符串 宏名。故可将一些常量定义为宏 宏开时,不检查字符串的意义,应注意这些字符引起的问题 #define N 50 main() { int a[N]; ....} main() { int a[50]; ....} 宏展开 # define PI 3.1416; main() {...... area=PI*r*r; ...... } main() {...... area=3.1416;*r*r; ...... } 宏展开 # define PI 3.1416; main() {...... area=r*r*PI; ...... } # define PI 3.1416; main() {...... area=r*r*3.1416;; ...... } ??? 尚可 宏展开 第9章第1节
第9章第1节 2)宏定义的位置和有效范围 位置—函数以外,一般在文件开头,函数之前 有效范围从定义处到文件结東或#nde命令处。 #define g 9.8 →→终止宏定义 main G的有效范围 #undef g f10 3)定义宏时可引用已定义过的宏 f define r3 define pl3 1416 maino # define L2中PR展升,钿 printf“L=%fnS=%「m”,2*3.1416*3,3.1416*33) f define s plr*r man print“L=%fnS=%fn”,L,S); 注:双引号中的内容不展开
2). 宏定义的位置和有效范围 位置——函数以外,一般在文件开头,函数之前 有效范围——从定义处到文件结束或#undef命令处。 #define G 9.8 终止宏定义 main() {.... } #undef G f1() {..... } G的有效范围 3). 定义宏时可引用已定义过的宏 # define R 3 # define PI 3.1416 # define L 2*PI*R # define S PI*R*R main() {printf(“L=%f\nS=%f\n”,L,S); } main() {printf(“L=%f\nS=%f\n”,2*3.1416*3,3.1416*3*3); } 展开 注:双引号中的内容不展开 第9章第1节
第9章第1节 二.代参数的宏定义 1形式 # define宏名(参数表)字符串 #define s(a, b)ab 相当于S(a,b)←令a*b 如函数中有: area=S(3, 2); area=3*2:3,2是实参,代替形参b 不是参数,保留 #define s(a, b) a*b t define pi 3.1416 # define s(r)PI“r*r main float a, area; a=36; area=S(a): area=P*rr:一→area=3.1416*3.6*3.6; printf(%fm”,area);
二. 代参数的宏定义 1.形式 # define 宏名(参数表) 字符串 #define S(a,b) a*b 相当于 S(a,b) a*b 如函数中有: area=S(3,2); #define S(a, b) a*b area=3*2; 3,2是实参,代替形参a,b *不是参数,保留 # define PI 3.1416 # define S(r) PI*r*r main() {float a,area; a=3.6; area=S(a); printf(“%f\n”,area); } area=PI*r*r; area=3.1416*3.6*3.6; 第9章第1节