资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第八章 编译预处理,什么是编译预处理,C,语言程序中可以使用的一些命令,在通常的编译之前先执行这些命令,再将命令处理结果与源程序一起进行编译,C,的编译预处理,宏定义,文件包含,条件编译,8,1,宏定义,一、不带参数的宏定义,格式:,#define,标识符 字符序列,作用:定义符号常量,标识符称为宏名,预处理:把所有的宏名替换成字符序列,-,宏展开,、,宏替换,说明:,1,不加分号,#define PI 3.14159;,s=PI*r*r; error,s=r*r*PI;,no,error,2.,字符序列中的错误在替换处出现,#define ONE 0128,c=ONE*25;,3.,宏名一般用大写字母表示,4.,宏定义中可以使用已定义的宏名,#define R 3.54,#define PI 3.14,#define area PI*R*R,5.,宏展开不在字符串中进行,printf(“PI,=%,d”,PI,);,6.,宏定义的作用域:从定义开始,可以用,#,undef,命令终止宏定义的作用域,#define N 10,.,#,undef,N,二、带参数的宏定义,格式:,#define,宏名,(,参数表,),字符序列,宏替换:将带实参的宏中的参数按从左到右的顺,序替换字符序列中的形参,非形参字符保留,例:,#define,S(a,b,) a*b,t=S(2,3)*5;,说明:,1,形参与宏名之间不能有空格,#define,S,(a,b,) a*b,S(2,3)-(,a,b,) a*b(2,3),2,实参可以是常量、变量、表达式,但只是符号串替换,无计算过程,#define,S(a,) PI*a*a,S(a+b,) -PI*,a+b,*,a+b,办法:形参用括号括起来,#define,S(a,) PI*(a)*(a),S(a+b,)-PI*(,a+b,)*(,a+b,),3,区分宏定义与函数,*宏替换在编译时进行,函数调用在运行时进行,*宏定义中形参无类型说明,函数中形参有类型说明,*调用函数时要求形参、实参类型一致,宏替换则无此要求,*宏替换没有返回值,函数一般都有返回值,#define,MAX(a,b,) (a)(,b)?(a,): (b),int,max(int,a,int,b),return(a,b?a:b,); ,*宏替换只是简单的字符串替换,调用函数时先计算实参表达式的值,*函数调用比宏替换代价大,给形参分配存储单元、返回地址、返回值,*宏替换使目标代码增大,宏一般用于定义简短的运算,#define,MAX(a,b,) (a)(,b)?(a,): (b),int,max(int,a,int,b),return(a,b?a:b,); ,格式:,#include “,文件名”,#include ,作用:将,include,命令中指出的文件,插入到,include,命令处,两个文件合在一起编译,便于使用系统函数和公用部分,说明:,1,一条,include,命令只能包含一个文件,2,包含可以嵌套,/*,try.c,*/,#include “,file1.c,”,.,/*,file1.c,*/,#include “,file2.c,”,8,2,文件包含,3,被包含文件中定义的全局变量、内部函数,在包含文件中也有效,4,#define “file”,与,#define ,的,区别,:,“,file”,先查找当前目录,找不到再到指定的,Include,目录中,(MinGWinclude),查找,直接到指定的,Include,目录中查找,以下for语句构成的循环执行了,次,#define N 2,#define M N+1,#define NUM (M+1)*M/2,main( ),int i,n=0;,for(i=1; i= ,a&c,= ,A&c,= Z) c+=32;,#,endif,printf(“%c”,c,);,作用:,增强程序的通用性、灵活性、可移植性,减少目标程序的长度,
展开阅读全文