c语音上课第5章编译预处理_第1页
c语音上课第5章编译预处理_第2页
c语音上课第5章编译预处理_第3页
c语音上课第5章编译预处理_第4页
c语音上课第5章编译预处理_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章编译预处理5.1文件包含5.2宏定义5.3条件编译说明:(1)编译预处理命令不属于C/C++语言的语法范畴,每一条编译预处理命令单独占一行,均以“#”开头,而且末尾不加分号。预处理命令可以出现在程序中的任何位置,通常位于源程序的开始。(2)程序运行的过程是:先编译,再链接,最后执行。编译预处理是在编译之前所进行的处理工作。

在对一个源文件进行编译时,如果源文件中有预处理指令,系统将自动引用预处理程序对源文件中的预处理部分进行处理,然后再对源文件进行编译,如果文件中没有预处理指令,则直接进行编译。5.1文件包含格式有两种:#include<文件名>

或#include"文件名"区别:使用尖括号(<>),表示直接到指定的标准包含文件目录去寻找文件(标准包含文件目录是由用户在设置环境时设置的),不在源文件所在目录中寻找;使用双引号(“”),表示先在当前源文件所在目录中寻找,如果找不到,再到标准包含文件目录寻找。提醒:如果被包含的文件不在当前源文件所在目录,也不在标准包含文件目录,那么就不能单单只写文件名,还要在文件前加上路径,

例如#include"d:\\test\test.h"。说明:(1)一条文件包含(include)命令只能包含一个文件。#include<stdio.h>//文件包含命令,把文件stdio.h包含到本文件中#include<math.h>//文件包含命令,把文件math.h包含到本文件中voidmain(){floatx,y;scanf("%f",&x);if(x>=0)y=sqrt(x);//数学函数sqrt()用来求开方elsey=sqrt(-x);printf("x=%f,y=%f\n",x,y);}说明:(2)文件包含命令不仅可以包含头文件,也可以包含源文件。

例:文件file1.c文件中的内容如下:inta,b,c;floatm,n,p;(3)文件包含也可以嵌套使用,即被包含的文件中还可以使用#include语句再包含其他文件。

file2.c文件的内容如下:#include"file1.c"voidmain(){……}经过编译预处理后,file2.c文件的内容为:inta,b,c;floatm,n,p;voidmain(){……}5.2宏定义(分为“无参宏”和“带参宏”)无参宏定义格式为:#define符号常量名

字符串

其中,符号常量名称为“宏名”,习惯上用大写字母表示,符号常量名与所对应的字符串之间用“空格”符隔开。

在程序中,凡是遇到符号常量名的地方,经过编译预处理后,都被替换为它所对应的字符串。

宏名的有效范围为定义命令之后到本源文件结束,但可利用#undef命令来终止宏定义的作用域。例:

无参宏使用举例#definePI3.14#include<stdio.h>voidfun(){floats,d,r;r=5.0;s=PI*r*r;//计算面积,PI被3.14替换printf("%f",s);d=2*PI*r;//计算周长,PI被3.14替换printf("%f",d);}#undefPI//终止了PI的宏定义,PI的有效范围到此为止,在main函数中不起作用。voidmain(){…}说明:(1)预处理程序对符号常量的处理只是进行简单的替换工作,不作语法检查,如果程序中使用的预处理语句有错误,只能在真正的编译阶段检查出来。(2)程序中出现的由双引号括起来的字符串,即使和符号常量名相同,也不进行宏替换。(3)宏定义允许嵌套。

例:#definePI3.14#defineD2*PI(4)利用宏定义替换表达式时,要注意圆括号的重要性。例:

无参宏出现在双引号下的情况示例。#definePI3.1415926#include<stdio.h>voidmain(){printf("PI”);//PI不进行替换}输出结果为:PI例:无参宏替换表达式示例。#defineM10*(a+b)#include<stdio.h>voidmain(){inta,b,s;printf(“inputa,b:\n”);scanf(“a=%d,b=%d”,&a,&b);s=M;printf("s=%d”,s);}

程序的运行情况是:inputa,b:a=1,b=2↙s=30例:无参宏使用不当示例。#defineMa+b#include<stdio.h>voidmain(){inta,b,s;printf(“inputa,b:\n”);scanf(“a=%d,b=%d”,&a,&b);s=10*M;printf("s=%d”,s);}程序的运行情况是:inputa,b:a=1,b=2↙s=12Why?有参宏定义格式:#define宏名(参数表)字符串

其中,宏名与圆括号之间不能有空格,字符串中应该含有在参数表中所指定的参数。在替换时,不仅对定义的宏名进行宏替换,而且进行参数替换。说明:(1)用于替换参数的实参可以是常量、已被赋值的变量或者表达式。例:

带参宏替换时用常量替换参数示例。#defineM(x)x*10//带参宏定义#include<stdio.h>voidmain(){ints;s=M(5);//用常量替换参数printf("s=%d”,s);}

程序的运行情况是:s=50例:

带参宏替换时用赋值的变量替换参数示例。#defineM(x)x*10//带参宏定义#include<stdio.h>voidmain(){ints,a;printf(“inputa:\n”);scanf(“a=%d”,&a);s=M(a);//用赋过值的变量替换参数printf("s=%d”,s);}程序的运行情况是:inputa:a=5↙s=50例:

带参宏替换时用表达式替换参数示例。#defineM(x)x*10//带参宏定义#include<stdio.h>voidmain(){ints,a;printf(“inputa:\n”);scanf(“a=%d”,&a);s=M(a+1);//用表达式替换参数printf("s=%d”,s);}程序的运行情况是:inputa:a=4↙s=14为何不是50?说明(2) 带参宏允许宏定义嵌套。例:

分析以下程序的执行结果。#defineMA(a)(2*(a))#defineMB(b,c)(2*MA(b)+c)#include<stdio.h>voidmain(){inti=1,j=2;printf("%d\n",MB(j,MA(i)));}程序的运行结果是:105.3条件编译

C/C++语言中的条件编译命令可以控制哪些代码参与编译,哪些代码不参与编译。这一功能的运用,有助于程序的调试和移植。形式1:#if和#endif其一般形式为:

#if常量表达式1

程序段1#endif

其含义是当常量表达式1的值为真时,则编译程序段1;否则不编译。注意:(1)#if后面的表达式必须是常量表达式,不可使用变量。(2)#if和#endif必须配对使用。形式2:带有#elif的条件编译其一般形式为:#if表达式1

程序段1#elif表达式2

程序段2#elif表达式3

程序段3

……#else

程序段n#endif

#elif的含义是“elseif”,该命令的功能是如果表达式1的值为真,则编译程序段1;否则如果表达式2的值为真,编译程序段2;如果所有表达式的值都为假,则编译程序段n。也可以没有#else部分,如所有表达式的值为假,则此命令中没有程序段被编译。形式3:#ifdef的运用其一般形式为:#ifdef宏名

程序段1#else

程序段2#endif

其功能是用来测试一个宏名是否被定义,如果宏名被定义,则编译程序段1;否则编译程序段2。

该命令形式可简化为没有#else部分,这时,如宏名未被定义,则此命令中没有程序段被执行。形式4:#ifndef的运用定义的一般形式为:#i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论