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

下载本文档

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

文档简介

编译预处理

所谓预处理是指,在对源程序进行编译之前,先对源程序中的预处理命令(主要指宏定义命令、文件包含命令和条件编译命令)进行处理;然后再将处理的结果,和源程序一起进行编译,以得到目标代码。预处理宏定义文件包含条件编译编译预处理编译连接执行#define#include为了和一般C语句相区别,这些命令以符号#开头。7.1.1不带参数的宏定义(简单替换)

用标识符来代表一个字符串(给字符串取个名字)。C语言用“#define”进行宏定义。C编译系统在编译前将这些标识符替换成所定义的字符串。概念格式#define标识符字符串相关概念宏名:宏定义中的标识符称为“宏名”。宏展开:在预编译时将宏名替换成字符串的过程称为“宏展开”。#definePI3.14159267.1宏定义#include<stdio.h>#definePI3.1415926 voidmain(){floatradius,length,area,volume;

printf("Inputaradius:");

scanf("%f",&radius);length=2*PI*radius; area=PI*radius*radius; volume=PI*radius*radius*radius*3/4;printf("length=%.2f,area=%.2f,volume=%.2f\n",length,area,volume);}

例7.1输入圆的半径,求圆的周长、面积和球的体积。要求使用无参宏定义圆周率。1、宏名遵循标识符规定,习惯用大写字母表示,以便区别普通的变量。2、#define之间不留空格,宏名两侧空格(至少一个)分隔。3、宏定义字符串不要以分号结束,否则分号也作为字符串的一部分参加展开。从这点上看宏展开实际上是简单的替换。说明#definePI3.14;area=PI*r*r;area=3.14;*r*r;宏展开4、宏定义是预处理指令,与定义变量不同,它只是进行简单的字符串替换,不分配内存。5、宏定义用宏名代替一个字符串,并不管它的数据类型是什么,也不管宏展开后的词法和语法的正确性,只是简单的替换。是否正确,编译时由编译器判断。 例如:#definePI3.I4

照样进行宏展开(替换),是否正确,由编译器来判断。6、#define命令出现在程序中函数的外面,宏名的有效范围从定义命令开始直到本源程序文件结束。可以通过#undef终止宏名的作用域。#defineG9.8#definePI3.14 intf1(){……}#undefGvoidmain(){……}G的有效范围PI的有效范围7、宏定义时,可以引用已定义的宏名,可以层层置换。若宏名出现在双引号“”括起来的字符串中时,将不会产生宏替换。#defineR3.0#definePI3.14 #defineL2*PI*R#defineSPI*R*Rvoidmain(){

printf(“L=%f\nS=%f\n”,L,S);}宏展开printf(“L=%f\nS=%f\n”,2*3.14*3.0,3.14*3.0*3.0);7.1.2带参数的宏定义

带参数的宏定义不只是进行简单的字符串替换,还要进行参数替换。格式概念#define宏名(参数表)字符串类似函数头,但是没有类型说明,参数也不要类型说明展开置换规则按照#define命令行中指定的“字符串”从左到右进行置换(扫描置换)。如果串中包含宏定义中的形参,则将程序中相应的实参代替形参,其它字符原样保留,形成了替换后的字符串。举例#defineS(a,b)a*barea=S(3,2);宏展开area=3*2;例7.2用带参数的宏定义表示圆的面积。#definePI3.14#defineS(r)PI*r*r voidmain(){floata,area;a=3.6;

area=S(a);

printf(“r=%f\narea=%f\n”,a,area);}area=3.14*a*a;宏展开1、正因为带参宏定义本质还是简单字符替换(除了参数替换),所以容易发生错误。例:#defineS(r)3.14*r*r

area=S(a+b);说明宏展开area=3.14*a+b*a+b;不再是求面积了。此时S是符号常量(不带参的宏名),它代表字符串“(r)3.14*r*r”。2、定义带参数宏时还应该注意宏名与参数表之间不能有空格。有空格就变成了不带参数的宏定义。

例:#defineS(r)3.14*r*r7.2“文件包含”处理概念格式

#include“文件名”或#include<文件名>所谓“文件包含”处理是指一个源文件可以将另外一个源文件的全部内容包含进来,即将另外的文件包含到本文件之中。示意图#include<file2.c>AB

包含file2.cfile1.cABfile1.c1、被包含的文件常常被称为“头文件”(#include一般写在文件的开头)。头文件常常以“.h”为扩展名(也可以用其它的扩展名,.h只是习惯或风格)。2、一条#include只能包含一个头文件,如果要包含多个头文件,使用多条#include命令。3、在一个被包含的文件中又可以包含另一个被包含文件,即文件包含是可以嵌套的。4、被包含的头文件可以用“”括起来,也可以用<>括起来。区别在于:“”先在用户当前目录查找头文件,如果没找到,再到存放C库函数头文件的目录中查找;而<>直接到存放C库函数头文件的目录中查找。一般地说,使用双引号比较保险。5、习惯上,用户头文件一般在用户目录下,所以常常用“”;系统库函数的头文件一般在系统指定目录下,所以常常用<>。

说明概念:所谓“条件编译”,是对部分内容指定编译的条件,使其只在满足一定条件才进行编译。条件编译命令的几种形式:(1)#ifdef

标识符

程序段1#else

程序段2#endif(2)#ifndef

标识符

程序段1#else

程序段2#endif(3)#if表达式

程序段1#else

程序段2#endif7.3条件编译例7.3输入一行字母字符,根据需要设置条件编译,使之能将字母全改为大写输出,或全改为小写字母输出。#include<stdio.h>#defineLETTER1voidmain(){charstr[20]="CLanguage",c;

inti=0;

while((c=str[i])!='\0'){i++;#ifLETTERif(c>='

温馨提示

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

评论

0/150

提交评论