第7章编译预处理_第1页
第7章编译预处理_第2页
第7章编译预处理_第3页
第7章编译预处理_第4页
第7章编译预处理_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

宏定义文件包含条件编译第7章编译预处理本章要点1编译预处理是C语言编译系统的一个组成部分。C编译系统对程序进行编译之前,先对程序中以#开头的特殊命令进行“预处理”,然后将预处理结果和源程序一起进行编译处理,得到目标代码。C语言提供的预处理功能主要有三种:宏定义、文件包含、条件编译。它不属于c语言语句,可出现在程序的任何位置,有效范围从它们的出现点开始。第7章编译预处理2宏定义C语言中的宏定义分为:

不带参数的宏定义和带参数的宏定义在C语言源程序中允许使用“宏”,即用一个指定的标识符表示一个字符串。其中标识符称为“宏名”,字符串称为“宏体”。在编译预处理时,对程序中所有出现的“宏名”,都用宏体去替换,这个替换过程称为“宏代换”或“宏展开”。3宏定义一、不带参数的宏定义宏名:由标识符定义宏体:

为一字符串例如:

#definePI3.1415926功能:编程时用宏名PI来代替“3.1415926”这个字符串,在编译预处理时,把程序中在该命令以后出现的PI用“3.1415926”替换。不带参数宏定义一般形式:

#define

宏名宏体4宏展开后:a=2*3.1415926*r;s=3.1415926*r*r;例1#definePI3.1415926main(){ floata,s,r; printf("inputradiusr:"); scanf("%f",&r); a=2*PI*r; s=PI*r*r; printf("r=%f,a=%f,s=%f\n",r,a,s);}宏定义5说明:

1.宏定义用宏名代替一个字符串,预处理时仅做置换,不做语法检查,只在编译已被宏展开的源程序时才报错。

2.编写程序时,用宏名代替一个字符串,可以减少程序中重复书写某些字符串的工作量,而且便于修改,同时可以提高程序的可移值性。

3.宏名通常用大写字母表示,这并不是语法规定,只是为了与变量名区别。

4.宏定义不是c语句,不必在行末加;号。

5.宏定义的位置通常放在程序的开头,作为文件的一部分,其作用域为从宏定义位置开始到此文件结束。但可以用“#undef

宏名”命令终止宏定义的作用域,这样可以灵活控制宏定义的作用范围。宏定义6

6.宏定义允许嵌套。即在进行宏定义时,可以在宏体中使用已定义的宏名,在预处理时进行层层替换。

例#defineR3.0#definePI3.14159#defineSPI*R*Rmain(){printf(“S=%f\n”,S);}7.出现在字符串中的宏名,在预处理时不对其进行替换。

8.若用户标识符中的一部分与宏名相同,则在预处理时不对其进行替换。例如:

#defineLT200main(){int

PLTER=10;……}

宏名LT不会替换变量名PLTER中的LT。

9.同一个宏名不能重复定义。宏定义7带参数的宏定义一般形式:#define宏名(形式参数)宏体宏体:

应包含形参例如:#defineAS(x,y,z)x+y+z……sum=AS(3,4,5);功能:

预编译时用宏体代换宏名,同时用实参代换形参。即用3+4+5代替AS(3,4,5)宏定义二、带参数的宏定义8例:#include"stdio.h"#defineMIN(a,b)a<b?a:bmain(){ floatx,y,min;

scanf("%f%f",&x,&y);

min=MIN(x,y);

printf("min=%f\n",min);}

宏定义经宏展开后为:

min=x<y?x:y;9说明:1.在宏名与带参数的括号之间不应加空格2.与不带参数的宏定义一样,同一个宏名不能重复定义3.注意带参数的宏与函数不同宏定义A.函数调用,先求实参然后传给形参;宏只是替代B.函数在运行时处理,宏在编译时进行,不占运行时间C.函数中形参与实参要进行类型定义;宏不存在类型问题D.函数只可得到一个返回值。宏可设法得到几个结果E.宏展开后可使程序变长;函数调用源程序长度不变10文件包含文件包含的一般形式:

#include“文件名”或:#include<文件名>功能:用指定文件的全部内容来替换该命令行,使之成为源程序一部分。说明:1.一个#include命令只能指定一个包含文件。2.文件包含可以嵌套。3.当包含文件修改后,对包含该文件的源程序必须重新进行编译连接处理。

4.#include“文件名”形式,系统先在引用被包含文件源文件所在目录中寻找,找不到再按标准方式检索其他目录;#include<文件名>方式不检查源文件所在目录,直接按标准方式检索文件目录。11例如:文件f3.c包含文件f4.c文件f4.cfloatave(float

a[],intn){

intk; floataver,sum=a[0]; for(k=1;k<n;k++) sum=sum+a[k]; aver=sum/n;

return(aver);}文件f3.c#include"f4.c"main(){ floats[10];intk; for(k=0;k<10;k++)

scanf("%f",&s[k]); printf("%f\n",ave(s,5)); printf("%f\n",ave(s,10));}文件包含12条件编译满足条件进行编译,不满足条件不编译。形式1:#ifdef

标识符程序段1#else

程序段2#endif形式2:#if

温馨提示

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

评论

0/150

提交评论