《编译预处理.ppt》由会员分享,可在线阅读,更多相关《编译预处理.ppt(21页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、编译预处理编译预处理15.1 15.1 概概 述述15.2 15.2 宏宏 定定 义义15.3 15.3 文文 件件 包包 含含15.4 15.4 条条 件件 编编 译译15.1 15.1 概概 述述预预处处理理功功能能由由预预处处理理命命令令组组成成,这这些些命命令令在在进进行行编编译译功功能能(包包括括词词法法分分析析、语语法法分分析析、代代码码生生成成和和优优化化等等)之之前前进进行行处处理理,故故称称为为“编编译译预预处处理理”。预预处处理理后后的的程程序序再再进进行行编编译译、连连接接,最最后后形形成成计计算算机机可可以以执执行行的的机机器语言程序。器语言程序。C语言提供的编译预处理
2、功能有以下语言提供的编译预处理功能有以下3种:种:(1)宏定义;)宏定义;(2)文件包含;)文件包含;(3)条件编译。)条件编译。这些功能分别用宏定义命令、文件包含这些功能分别用宏定义命令、文件包含命令、条件编译命令来实现。这些预处理命命令、条件编译命令来实现。这些预处理命令不属于令不属于C语言中真正的语句,为了与一般语言中真正的语句,为了与一般C语言语句相区别,形式上都以语言语句相区别,形式上都以“#”开头,预开头,预处理命令后面也不加分号。处理命令后面也不加分号。15.2 15.2 宏宏 定定 义义15.2.1 不带参数的宏定义不带参数的宏定义1不带参数的宏定义不带参数的宏定义不带参数的宏
3、定义的一般定义形式如下:不带参数的宏定义的一般定义形式如下:#define标识符标识符字符序列字符序列例例15.1输入半径,求圆的周长、面积和体积。输入半径,求圆的周长、面积和体积。#definePI3.1415926main()floatl,s,r,v;printf(inputradius:);scanf(f,&r);l=2.0*PI*r;s=PI*r*r;v=4.0/3.0*PI*r*r*r;printf(l=10.4fns=10.4fnv=10.4fn,l,s,v);2终止宏定义命令终止宏定义命令终止宏定义命令的一般形式如下:终止宏定义命令的一般形式如下:#undef标识符标识符unde
4、f是是终终止止宏宏定定义义的的特特定定字字,其其作作用用是是从从该该命命令令开开始始,该该标标识识符符(宏宏名名)不不再再代代表表相相应应的的字字符符序序列列,即即该该标标识识符符的的作作用用范范围围到到此此处处结结束。束。例如,以下程序段:例如,以下程序段:#defineP100main()intaP,b,c;#undefP/*取消宏取消宏P,在以下的函数中,在以下的函数中P不再代表不再代表100*/intsum(intx,intn)例例15.2输出格式定义为宏的示例。输出格式定义为宏的示例。#definePRprintf#defineNLn#defineMACROd#defineMACRO
5、1MACRONL#defineMACRO2MACROMACRONL#defineMACRO3MACROMACROMACRONL#defineMACRO4MACROMACROMACROMACRONL#defineSsmain()inta,b,c,d;charstring=CHINA;a=1;b=2;c=3;d=4;PR(MACRO1,a);PR(MACRO2,a,b);PR(MACRO3,a,b,c);PR(MACRO4,a,b,c,d);PR(S,string);程序运行结果为:程序运行结果为:1121231234CHINA15.2.2 带参数的宏定义带参数的宏定义带参数的宏定义的一般形式如下
6、:带参数的宏定义的一般形式如下:#define宏名宏名(形参表形参表)字符序列字符序列形形参参表表由由一一个个或或多多个个参参数数组组成成,参参数数之之间间用用逗逗号号进进行行分分隔隔。字字符符序序列列中中应应该该包包含含有有形形参参表表所所指指定定的的参参数数。在在编编译译预预处处理理时时,带带参参数数的的宏宏调调用用在在展展开开时时,不不是是进进行行简简单单的的字字符符序序列列替替换换,而而是是进进行行实实参参到到形形参参的的替替换换。实实参参为为程程序序中中引引用用宏宏名名的的参参数数。带带参参数数的的宏宏定定义义进进一一步步扩扩充了宏定义的功能。充了宏定义的功能。例例15.3有以下程序
7、:有以下程序:#definePI3.1415926#defineS(r)PI*r*rmain()floata,area;a=3.6;area=S(a);printf(r=fnarea=fn,a,area);例例15.4下下面面程程序序是是把把简简单单表表达达式式用用宏宏定定义义的的方方法法实实现现的的示示例。例。#definePI3.1415926#define CIRCLE(R,L,S,V)L=2*PI*R;S=PI*R*R;V=4.0/3*PI*R*R*Rmain()floatr,l,s,v;/*半径、圆周长、圆面积、球体积半径、圆周长、圆面积、球体积*/scanf(r=f,&r);CIR
8、CLE(r,l,s,v);printf(r=6.2f,l=6.2f,s=6.2f,v=6.2fn,r,l,s,v);该程序把求解圆的周长、面积和体积的表该程序把求解圆的周长、面积和体积的表达式用宏来代替。在预处理阶段宏调用:达式用宏来代替。在预处理阶段宏调用:CIRCLE(r,l,s,v)被展开为:被展开为:l=2*3.1415926*r;s=3.1415926*r*r;v=4.0/3*3.1415926*r*r*r。15.3 15.3 文文 件件 包包 含含文文件件包包含含是是指指在在一一个个文文件件中中包包含含另另外外一一个个文件的内容。文件的内容。文件包含命令的一般格式:文件包含命令的一
9、般格式:#include文件名文件名或或#include其其中中include是是文文件件包包含含的的特特定定字字。预预处处理理时时,该该命命令令把把“文文件件名名”指指定定的的文文件件内内容容复复制制到到本本文文件件中中该该命命令令处处,替替代代该该条条命命令令,编编译译阶阶段段再再对对合合并并后后的的文文件件进进行行编编译译。文文件件名名要要使使用用全全名名,包括路径名和扩展名。包括路径名和扩展名。15.4 15.4 条条 件件 编编 译译1#ifdef条件编译命令条件编译命令#ifdef条件编译的一般格式为:条件编译的一般格式为:#ifdef标识符标识符程序段程序段1#else程序段程序
10、段2#endif其其中中标标识识符符是是用用define命命令令定定义义的的,该该条条件件编编译译命命令令的的作作用用是是:若若所所指指定定的的标标识识符符已已经经被被#define命命令令定定义义过过,则则在在程程序序编编译译阶阶段段只只编编译译程程序序段段1,否否则则编编译程序段译程序段2,#else部分可以没有。部分可以没有。例如程序调试信息的显示为:例如程序调试信息的显示为:#defineDEBUG#ifdefDEBUGprintf(x=d,y=d,z=dn,x,y,z);#endif2#ifndef条件编译命令条件编译命令#ifndef条件编译的一般格式为:条件编译的一般格式为:#i
11、fndef标识符标识符程序段程序段1#else程序段程序段2#endif该该命命令令的的作作用用与与#ifdef条条件件编编译译命命令令略略有有不不同同,若若标标识识符符未未被被定定义义过过,则则编编译译程程序序段段1,否否则编译程序段则编译程序段2。3#if条件编译命令条件编译命令#if条件编译的一般格式为:条件编译的一般格式为:#if表达式表达式程序段程序段1#else程序段程序段2#endif该该命命令令的的作作用用是是若若表表达达式式为为真真则则编编译译程程序序段段1,否则编译程序段否则编译程序段2。例例15.5输输入入一一行行字字母母字字符符,根根据据需需要要设设置置条条件件编编译译,使使之之能能将将字字母母全全改改为为大大写输出,或全改为小写输出。写输出,或全改为小写输出。程序如下:程序如下:#defineLETTER1main()charstr20=CLanguage,c;inti;i=0;while(c=stri)!=0)i+;#ifLETTERif(c=a&c=A&c=a&c=A&c=Z)c=c+32;
限制150内