90 likes | 214 Views
第九章 预处理命令. C 语言有一类编译预处理语句,该类语句的作用是在通常编译之前对程序作一定的处理,然后再由编译程序对预处理后的源程序进行通常的编译。现在所使用的 C 编译系统都包括了预处理、编译和连接等部分,在进行编译时一气呵成。. C 语言提供的预处理功能主要有以下 3 种: 1. 宏定义 2. 文件包含 3. 条件编译. 编译预处理语句的语法形式:. # 关键词 参数表. 编译预处理语句不用 “ ; ” 作为结束标志!. ⒈ 宏定义预处理. ⑴ 不带参数的宏定义.
E N D
第九章 预处理命令 C 语言有一类编译预处理语句,该类语句的作用是在通常编译之前对程序作一定的处理,然后再由编译程序对预处理后的源程序进行通常的编译。现在所使用的C编译系统都包括了预处理、编译和连接等部分,在进行编译时一气呵成。 C语言提供的预处理功能主要有以下3种: 1.宏定义 2.文件包含 3.条件编译 编译预处理语句的语法形式: #关键词 参数表 编译预处理语句不用“ ; ”作为结束标志!
⒈宏定义预处理 ⑴不带参数的宏定义 用一个指定的标识符(即名字)来代表一个字符串,也就是符号常量的定义,形式如下: #define宏名 字符串 #define PI 3.1415926 void main(void) { flaot r; scanf(“%f ”,&r) printf(“%f\n”,PI*r*r); } 编译时用字符串替代宏名。
说明: ⑴宏名一般习惯用大写; ⑵编译时用字符串无条件替代宏名; #define PI 3.1415926; … PI*r*r 3.1415926;*r*r ⑶宏名的有效范围,从定义到程序尾。也可以通过#undef修改 定义范围。 #define G 9.8 void main(void ) { … } #undef G #define R 3.0 #define PI 3.14159 #define S PI*R*R G的范围 printf(“S=%f”,S); 不替换。 ⑷可以在宏定义的字符串中使用已定义的宏名。 ⑸” ”字符串中的宏名不替换。
⑵带参数的宏定义 格式: #define 宏名(参数表) 含参数的字符串 替换过程: #define S( a , b ) a*b … area=S( 4 , 3 ); ①将实际参数替换宏定义的参数。 ②替换字符串中的参数。 ③替换整个宏。 4*3 带参的宏与函数的区别: 带参宏不分配内存单元,不返回值,只是在编译时按规则替换。 关于带参宏的说明: ①要严格按格式书写,否则会造成错误。 #define S(a,b) a*b S(3,4)被替换成: (a,b) a*b(3,4) ②参数有可能用到表达式时,参数字符要加()。 #define S(r) PI*(r)*(r) S(a+b)替换为:PI*(a+b)*(a+b) #define S(r) PI*r*r S(a+b)替换为:PI*a+b*a+b
#define M 3 #define N M+3 #define NN N*N main() { printf("NN=%d",NN); } #define M 3 #define N M+3 #define NN (N)*(N) main() { printf("NN=%d",NN); } 结果为: NN=(3+3)*(3+3)=36 结果为: NN=3+3*3+3=15
⒉文件包含 格式: #include <被包含的文件名> #include ”被包含的文件名” < >到存放C库函数的头文件的目录中寻找要包含的文件(标准方式); “ ”先到用户当前路径找要包含的文件,找不到时才按标准方式找。 作用:将指定的文件的包含到本文件中。
文件包含举例:求半径为r的园面积、园周长。文件包含举例:求半径为r的园面积、园周长。 #include “my.h” void main(void) { float r,fArea,fLen; scanf(“%f”,&r); fArea=S(r); fLen=L(r); printf(“Area=%f,Len=%f”,fArea,fLen); } float S(float r) { return PI*r*r; } float L(float r) { return 2*PI*r; } #include <stdio.h> #define PI 3.1415926 float S(float); float L(float);
⒊条件编译 C 语言可以通过条件控制,让编译系统编译不同的程序段,从 而提高程序的移植性并方便调试。 条件编译有三种形式: #ifdef 标识符 program seg1 #else program seg2 #endif #if 表达式 program seg1 #else program seg2 #endif 3 1 #ifndef 标识符 program seg1 #else program seg2 #endif 满足 不满足 条件? 2 编译程序段1 编译程序段2
举例:通过条件编译选择求最大值或最小值 #include <stdio.h> void main(void) { int a,b; scanf(“%d,%d”,&a,&b); #ifdef MAX printf(“%d”,a>=b?a:b); #else printf(“%d”,a<=b?a:b); #endif } #define MAX #include <stdio.h> void main(void) { int a,b; scanf(“%d,%d”,&a,&b); printf(“%d”,a>=b?a:b); }