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

下载本文档

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

文档简介

C语言程序设计第8章编译预处理问题:实际生活中,为了更好地处理一些事件或数据,会对其提前进行设定和准备,如:在对源程序进行通常的编译之前,先对程序中一些特殊的命令进行“预处理”。编译预处理用π代表圆周率3.14为避免重复,对已有的实行“拿来主义”。

ANSIC标准规定可以在C源程序中加入一些“预处理命令”,以改进程序设计环境,提高编程效率。引子

本章要点第8章编译预处理

本章难点预处理的概念

C语言处理系统的预处理功能预处理命令的使用带参宏定义条件编译编译预处理作用:对源程序编译之前做一些处理,生成扩展C源程序种类宏定义#define文件包含#include条件编译#if--#else--#endif等格式:“#”开头占单独书写行语句尾不加分号8.18.28.3宏定义条件编译文件包含第8章编译预处理如

if(x==YES)printf(“correct!\n”);elseif(x==NO)printf(“error!\n”);展开后:if(x==1)printf(“correct!\n”);elseif(x==0)printf(“error!\n”);宏定义的分类不带参数宏定义一般形式:#define宏名[宏体]功能:用指定标识符(宏名)代替字符序列(宏体)宏展开:预编译时,用宏体替换宏名---不作语法检查如

#defineYES1#defineNO0#definePI3.1415926#defineOUTprintf(“Hello,World”);宏体可缺省,表示宏名定义过或取消宏体定义位置:任意(一般在函数外面)作用域:从定义命令到文件结束#undef可终止宏名作用域格式:

#undef

宏名例

#defineYES1main(){……..}#undefYES#defineYES0max(){……..}YES原作用域YES新作用域宏定义可嵌套,不能递归例

#defineMAXMAX+10()引号中的内容与宏名相同也不置换例

#definePI3.14159printf(“2*PI=%f\n”,PI*2);宏展开:printf(“2*PI=%f\n”,3.14159*2);宏定义中使用必要的括号()例

#defineWIDTH80#defineLENGTH

WIDTH+40

var=LENGTH*2;宏展开:var=80+40*2;()()例

#defineWIDTH80#defineLENGTH

WIDTH+40

var=LENGTH*2;宏展开:var=80+40*2;8.1宏定义例8.1用不带参数的宏定义计算s=3*(y*y+3*y)+4*(y*y+3*y)+5*(y*y+3*y)#defineM(y*y+3*y)main(){int

s,y;

printf("Pleaseinputanumber:");

scanf("%d",&y);s=3*M+4*M+5*M;

printf("s=%d\n",s);}运行情况如下:Pleaseinputanumber:4↙s=336

算法分析:单在计算式子中出现了三个(y*y+3*y),为减少书写量,可使用宏定义。带参数宏定义一般形式:#define宏名(参数表)宏体例

#defineS(r)PI*r*r相当于定义了不带参宏S,代表字符串“(r)

PI*r*r”

宏展开:形参用实参换,其它字符保留宏体及各形参外一般应加括号()例

#defineS(a,b)a*b………..area=S(3,2);宏展开:

area=3*2;不能加空格例

#definePOWER(x)x*xx=4;y=6;z=POWER(x+y);宏展开:z=x+y*x+y;一般写成:#definePOWER(x)((x)*(x))宏展开:

z=((x+y)*(x+y));8.1宏定义#defineMAX(x,y)(x)>(y)?(x):(y)

main(){int

x,y,max;

printf("inputtwonumbers(x,y):");

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

max=MAX(x,y);

printf("max=%d\n",max);}例8.4用带参宏定义求两数中的大者。运行情况如下:inputtwonumbers(x,y):5,6↙max=6例8.5一个宏定义代表多条语句。#defineSSSV(s1,s2,s3,v)s1=l*w;s2=l*h;s3=w*h;v=w*l*h;main(){intl=3,w=4,h=5,sa,sb,sc,vv;

SSSV(sa,sb,sc,vv);

printf("sa=%d\nsb=%d\nsc=%d\nvv=%d\n",sa,sb,sc,vv);}运行情况如下:sa=12sb=15sc=20vv=60带参的宏与函数区别带参宏函数处理过程不分配内存简单的字符置换分配内存先求实参值,再代入形参处理时间编译时程序运行时参数类型无类型问题定义实参,形参类型返回值无有运行速度不占运行时间调用和返回占时间8.18.28.3宏定义条件编译文件包含第8章编译预处理条件编译的功能:在编译源文件之前,根据给定的条件决定编译的范围。形式一:

#ifdef

标识符程序段1#else

程序段2#endif如果标识符是已被#define命令定义过的宏名,就对程序段1进行编译;否则对程序段2进行编译。8.2条件编译没有else时,可省略条件编译举例#defineDEBUG

main(){inta=4;

#ifdefDEBUG

printf("Nowtheprogrammerisdebuggingtheprogram.");

#else

printf("a=%d.",a);#endif}若没有第一行的宏定义命令,程序运行后会输出:a=4.运行情况如下:Nowtheprogrammerisdebuggingtheprogram.条件编译形式二:#ifndef

标识符程序段1#else

程序段2#endif如果标识符未被#define命令定义过,就对程序段1进行编译;否则对程序段2进行编译。形式三:#if常量表达式程序段1#else

程序段2#endif如果常量表达式的值为真(非0),就对程序段1进行编译;否则对程序段2进行编译。例8.10设置一个开关,判断输入值是半径还是边长,实现求圆或正方形的面积。#defineR1main(){floatc,r,s;

printf("inputanumber:");

scanf("%f",&c);

#ifRr=3.14159*c*c;

printf("areaofroundis:%f\n",r);#elses=c*c;

printf("areaofsquareis:%f\n",s);#endif}运行情况如下:inputanumber:3↙areaofroundis:28.274309若程序的第一行改为:#defineR0则程序运行情况如下:inputanumber:3↙areaofsquareis:9.000000条件编译的应用一套程序要产生不同的版本(如演示版本和实际版本)、避免重复定义时,往往使用条件编译。在程序调试时,经常需要查看某些变量的中间结果。这时可以使用条件编译,在程序中设置若干调试用的语句。例如:#defineFLAG1#ifFLAG

printf("a=%d",a);#endif8.18.28.3宏定义条件编译文件包含第8章编译预处理文件包含的功能:一个源文件可将另一个源文件的内容全部包含进来。一般形式:

#include“文件名”

#include<文件名>#include“file2.c”file1.cfile2.cfile1.cfile2.cABA处理过程:预编译时,用被包含文件的内容取代该预处理命令,再对“包含”后的文件作一个源文件编译。“”先在当前目录搜索,再搜索标准目录;可指定路径<>直接按标准目录搜索,不能指定路径8.3文件包含例

#include"C:\TC\F2.c"√

#include<C:\TC\F2.c>被包含文件内容源文件(*.c)头文件(*.h)stdio.h:EOF和NULL宏定义及输入输出函数的原型

math.h:各个数学函数的原型io.h:数据类型struct

ftime的定义文件包含可嵌套#include“file2.c”file1.cAfile3.cC#include“file3.c”file2.cBfile1.cAfile3.cfile2.c将那些公用的或常用的宏定义、函数原型、数据类型定义及全局变量的定义和声明等,组织在一些头文件中,在程序需要使用到这些信息时,就用#include命令把它们包含到所需的位置上去,从而免去每次使用它们时都要重新定义或声明的麻烦。例8.11用户头文件的编写和使用

#ifndef__L8_11_H/*定义宏,以防止重复包含此头文件*/

#define__L8_11_H#include<stdio.h>#defineADD(a,b)((a)+(b))/*定义宏,实现两数的加法*/#defineSUB(a,b)((a)-(b))/*定义宏,实现两数的减法*/

int

MUL(int

a,intb)/*定义函数,实现两数的乘法*/

{returna*b;}floatDIV(float

a,floatb)/*定义函数,实现两数的除法*/

{if(b!=0)returna/b;else

printf("Error!Thedenocannotbezero!");}#endif头文件L8_11.h#include"L8_11.h"/*包含自定义头文件*/main(){int

a,b;

int

sum,product;floatdifference,quotient;

printf("Pleaseinputtwonumbers:");

scanf("%d,%d",&a,&b);sum=ADD(a,b);difference=SUB(a,b);product=MUL(a,b);quotient=DIV(a,b);

printf("sum=%ddifference=%f\n",sum,difference);

printf("product=%dquotient=%f\n",product,quotien

温馨提示

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

评论

0/150

提交评论