《c语言 编译预处理.ppt》由会员分享,可在线阅读,更多相关《c语言 编译预处理.ppt(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第八章第八章 编译预处理编译预处理8.1 宏定义编译预处理(命令):编译预处理(命令):#号开头的一些命令,在编译开始之前得到处理,用以辅助编号开头的一些命令,在编译开始之前得到处理,用以辅助编译器的编译工作。译器的编译工作。编译预处理命令不是编译预处理命令不是C C语言的组成部分,它有宏定义、文件包语言的组成部分,它有宏定义、文件包含、条件编译三种。含、条件编译三种。宏:宏:使用标识符代替的一串符号或动作。使用标识符代替的一串符号或动作。8.1.1 8.1.1 不带参数的宏定义不带参数的宏定义定义格式:定义格式:#define define 例:例:#define PI 3.1415926d
2、efine PI 3.1415926注:注:宏名使用大写字母,区别于一般的名字。宏名使用大写字母,区别于一般的名字。宏定义可以放在源程序的任意位置,但应该在使用宏名之前。宏定义可以放在源程序的任意位置,但应该在使用宏名之前。结尾不使用结尾不使用;号。号。【例【例8.18.1】宏定义使用举例。宏定义使用举例。#define M 2define M 2#define N 3#define N 3main()main()intint aMN,BNM,i,j;aMN,BNM,i,j;for(i=0;iM;i+)for(i=0;iM;i+)for(j=0;jN;j+)for(j=0;jN;j+)scan
3、f scanf(%d,&aij);(%d,&aij);for(i=0;iN;i+)for(i=0;iN;i+)for(j=0;jM;j+)for(j=0;jM;j+)bij=aji;bij=aji;for(i=0;iN;i+)for(i=0;iN;i+)for(j=0;jM;j+)for(j=0;jM;j+)printf printf(%3d,bij;(%3d,bij;printfprintf(n);(n);注:使用宏的优点注:使用宏的优点(1 1)修改容易。)修改容易。(2 2)含义直观。)含义直观。(3 3)书写简便不易出错)书写简便不易出错。几点说明:几点说明:(1)(1)可以嵌套定义可
4、以嵌套定义例:例:#define A 3define A 3#define B 4#define B 4#define C 5#define C 5#define S(A+B+C)/2#define S(A+B+C)/2(2)(2)字符串中有表达式,表达式应用括号扩起来(作整体处理)。字符串中有表达式,表达式应用括号扩起来(作整体处理)。例:例:#define SUM 3+4+5define SUM 3+4+5#define SUM(3+4+5)#define SUM(3+4+5)s=SUM/2;s=SUM/2;(3)(3)字符串常量中出现的与宏名相同的字符串不认为是宏。字符串常量中出现的与宏
5、名相同的字符串不认为是宏。#define S(3+4+5)define S(3+4+5)printfprintf(“(“S=S=%dn”,S);%dn”,S);编编译译预预处处理理时时不不替替换换“S=%dn”S=%dn”中中的的S S,所所以以输输出出语语句句的的替替换换结结果果为为:printfprintf(S=%dn,(3+4+5);(S=%dn,(3+4+5);(4)#(4)#undefundef可以结束一个宏定义。可以结束一个宏定义。(5)(5)(续行符)在宏定义中的作用。(续行符)在宏定义中的作用。8.1.2 8.1.2 带参数的宏定义带参数的宏定义定义格式:定义格式:#defin
6、e define ()例:例:#define PI 3.1415926define PI 3.1415926#define S(r2,r1)PI*(r2*r2-r1*r1)#define S(r2,r1)PI*(r2*r2-r1*r1)area=S(5,3);area=S(5,3);/*area=3.1415926*(5*5-3*3)*/*area=3.1415926*(5*5-3*3)*/注:注:建议建议形参形参和和整个字符串整个字符串都应加括号都应加括号#define S(r2,r1)PI*(r2*r2-r1*r1)define S(r2,r1)PI*(r2*r2-r1*r1)#defin
7、e S(r2,r1)PI*(r2)*(r2)-(r1)*(r1)#define S(r2,r1)PI*(r2)*(r2)-(r1)*(r1)area=S(5+4,4+3);area=S(5+4,4+3);/*area=3.1415926*(5+4*5+4-4+3*4+3)*/*area=3.1415926*(5+4*5+4-4+3*4+3)*/*area=3.1415926*(5+4)*(5+4)-(4+3)*(4+3)/*area=3.1415926*(5+4)*(5+4)-(4+3)*(4+3)*/*/#define MAX(a,b)(a)(b)define MAX(a,b)(a)(b)?
8、(a):(b)?(a):(b)#define MAX(a,b)(a)(b)#define MAX(a,b)(a)(b)?(a):(b)?(a):(b)MAX(p+q,s+t)+1;MAX(p+q,s+t)+1;/*(p+q)(s+t)/*(p+q)(s+t)?(?(p+qp+q):():(s+ts+t)+1*/)+1*/MAX(p+q,s+t)+1;MAX(p+q,s+t)+1;/*(p+q)(s+t)/*(p+q)(s+t)?(?(p+qp+q):():(s+ts+t)+1*/)+1*/【例例8.18.1】从键盘输入从键盘输入1010个整数,找出其中的奇数并求和。个整数,找出其中的奇数并求和
9、。#define ISODD(a)(a)%2=1)?1:0)define ISODD(a)(a)%2=1)?1:0)main()main()intint a,i,sum=0;a,i,sum=0;for(i=1;i=10;i+)for(i=1;i=10;i+)scanfscanf(%d,&a);(%d,&a);if(ISODD(a)if(ISODD(a)sum=sum+a;sum=sum+a;函数和带参数的宏定义的关系:函数和带参数的宏定义的关系:(1)(1)调用和宏展开。调用和宏展开。(2)(2)调用对实参有类型要求,宏定义的实参无类型要求。调用对实参有类型要求,宏定义的实参无类型要求。8.2
10、 文件包含文件包含命令:文件包含命令:#includeinclude两种形式:两种形式:(1)#(1)#include“include“包含文件名包含文件名”/*/*从当前目录和系统路径搜索被从当前目录和系统路径搜索被 包含文件包含文件*/(2)#(2)#include include /*/*系统路径搜索被包含文件系统路径搜索被包含文件*/文件包含命令的用处:文件包含命令的用处:在被包含文件(头文件)中集中书写符号常量定义、宏定义在被包含文件(头文件)中集中书写符号常量定义、宏定义或外部说明等。或外部说明等。在每个需要这些定义或说明的源程序文件开始,用文件包含在每个需要这些定义或说明的源程序
11、文件开始,用文件包含命令将这个头文件包含到程序中。命令将这个头文件包含到程序中。注:注:(1)(1)文件包含可以嵌套。文件包含可以嵌套。(2)(2)一个一个#includeinclude命令只命令只 可以包含一个头文件。可以包含一个头文件。例如:例如:自定义头文件自定义头文件const.hconst.h#include“#include“stdiostdio.h”.h”#define BUFFERSIZE 512#define BUFFERSIZE 512intint maxinmaxin(intint,intint););float a,b;float a,b;8.3 条件编译条件编译条件编
12、译:按照一定的条件控制源程序中的某些程序行是否参加编按照一定的条件控制源程序中的某些程序行是否参加编 译。可以处理程序移植以及逐段调试程序。译。可以处理程序移植以及逐段调试程序。三种形式:三种形式:1 1、#ifif、#else#else、#elifelif、#endifendif命令命令格式格式1 1#if if 条件条件 程序段程序段1 1#elseelse 程序段程序段2 2#endifendif格式格式2 2#if if 条件条件 程序段程序段#endifendif格式格式3 3#if if 条件条件1 1程序段程序段1 1#elifelif 条件条件2 2程序段程序段2 2#elif
13、elif 条件条件3 3程序段程序段3 3#elifelif 条件条件n n程序段程序段n n#else#else程序段程序段n+1n+1#endifendif【例【例8.18.1】编写一个程序,对数入的编写一个程序,对数入的2020个整数,利用条件编译使该个整数,利用条件编译使该 程序可以求这程序可以求这2020个数中的奇数和,也可以求其偶数和。个数中的奇数和,也可以求其偶数和。#define FLAG 1define FLAG 1main()main()intint a20,i,sum=0;a20,i,sum=0;for(i=0;i20;i+)for(i=0;i20;i+)scanfsca
14、nf(%d,&ai);(%d,&ai);#if FLAG#if FLAGfor(i=0;i20;i+)for(i=0;i20;i+)if(ai%2=1)if(ai%2=1)sum=sum+ai;sum=sum+ai;printfprintf(sum of odd:%dn,sum);(sum of odd:%dn,sum);#else#elsefor(i=0;i20;i+)for(i=0;i20;i+)if(ai%2=0)if(ai%2=0)sum=sum+ai;sum=sum+ai;printfprintf(sum of even:%dn,sum);(sum of even:%dn,sum);
15、#endifendif 3 3、#ifndefifndef、#else#else、#endifendif命令命令2 2、#ifdefifdef、#else#else、#endifendif命令命令格式格式1 1#ifdefifdef 宏名宏名程序段程序段1 1#elseelse程序段程序段2 2#endifendif格式格式2 2#ifdefifdef 宏名宏名程序段程序段#endifendif#ifdef ifdef DEEPTHDEEPTH#define STACK 100#define STACK 100#else#else#define STACK 150#define STACK 150#endifendif#define DEEPTH 1#define DEEPTH 1#define DEEPTH#define DEEPTH格式格式1 1#ifndef ifndef 宏名宏名程序段程序段1 1#elseelse程序段程序段2 2#endifendif格式格式2 2#ifndef ifndef 宏名宏名程序段程序段#endifendif