下载

1下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 09_第09章 预处理命令

09_第09章 预处理命令.ppt

09_第09章 预处理命令

tianxingmeizhou
2010-12-15 0人阅读 举报 0 0 暂无简介

简介:本文档为《09_第09章 预处理命令ppt》,可适用于工程科技领域

第九章预处理命令第九章预处理命令编译预处理:在源程序文件中加入“编译预处理命令”使编译程序在对源程序进行通常的编译(包括词法分析、语法分析、代码生成、代码优化)之前先对这些命令进行预处理然后将预处理的结果和源程序一起再进行通常的编译处理以得到目标代码(OBJ文件)。C提供的编译预处理命令宏命令(Macro)文件包含命令(include)条件编译命令这些命令均以#开头以区别于语句。宏定义宏定义不带参数的宏定义一般形式:#define标识符字符串例:#definePI作用:用标识符(称为“宏名”)PI来代替这个字符串在编译预处理时将程序中在该命令以后出现的所有的PI都用代替(这一过程又称为“宏展开”)。例#definePImain(){floatl,s,r,vprintf("inputradius:")scanf("f",r)l=*PI*rs=PI*r*rv=*PI*r*r*rprintf("l=fns=fnv=fn",l,s,v)}说明:)宏名一般习惯用大写字母表示。非强制规定也可用小写字母)使用宏定义可以提高程序的通用性能作到“一改俱改”)宏定义只作简单的替换不作正确性检查。如果词义或语义错误只有在编译已被宏展开后的源程序时才会发现错误井报错。例如:#definePIl把第二个“”写成“l”。这样的错误只有在编译已被宏展开后的源程序时才会发现错误井报错)宏定义不是C语句不必在行末加分号如果加了分号则会连同分号以其进行替换如:#definePIarea=P*r*r在宏扩展后成为:area=*r*r结果在编译时出现语法错误。)宏名的有效范围为定义命令之后到本源文件结束。通常#define命令写在文件开头函数之前作为文件一部分在此文件范围内有效。)可以用#undef命令终止宏定义的作用域。这样可以灵活控制宏定义的作用范围。)在进行宏定义时可以引用已定义的宏名可以层层置换。例#defineR#definePI#defineL*PI*R#defineSPI*R*Rmain(){printf(“L=fnS=fn”,L,S)})对程序中用双括号括起来的字符串内的字符即使与宏名相同也不进行置换)宏定义是专门用于预处理命令的一个专用名词它与定义变量的含义不同只作字符替换不分配内存空间带参数的宏定义带参数的宏定义一般形式#define宏名(参数表)字符串字符串中包含在括弧中所指定的参数。例如#defineS(a,b)a*barear=S(,)其中S(,)相当与*置换方式从左到右进行置换。形参用相应的实参(可以是常量、变量或表达式)代替不是参数字符则保留。例#definePI#defineS(r)PI*r*rmain(){floata,areaa=area=S(a)printf(“r=fnarea=fn”,a,area)}说明:()用宏名后面括号内的实参字符串原样代替#define命令行中的形参。如果有以下语句:area=S(ab)应当在定义时形式参数外面加一个括弧。#defineS(r)PI*(r)*(r)()在宏定义时在宏名与带参数的括弧之间不应加空格否则将空格以后的字符都作为替代字符串的一部分S(r)PI*r*rarea=PI*ab*ab注意计算次序参数的宏和函数的比较:类似之处:在引用函数时也是在函数名后的括弧内写实参也要求实参与形参的数目相等带参的宏定义与函数的区别:()函数调用时先求出实参表达式的值然后代入形参。而使用带参的宏只是进行i简单的字符替换()函数调用是在程序运行时处理的分配内存单元。而宏展开是在编译时进行的在展开时并不分配内存车元不进行值的传递处理也没有“返回值”的概念()对函数中的实参和形参都要定义类型二者的类型要求一致。不一致应进行类型转换。而宏不存在类型问题宏名无类型它的参数也元类型只是一个符号代表。调用函数只可得到一个返回值而用宏可以设法得到几个结果。使用宏次数多时宏展开后源程序长因为每展开一次都使程序增长而函数调用不使源程序变长。宏替换不占运行时间识占编译时间。而函数调用则占运行时间(分配单元、保现场、值传递、返回)。“文件包含”处理“文件包含”处理所谓“文件包含”处理是指一个源文件可以将另外一个源文件的全部内容包含进来即将另外的文件包含到本文件之中。C语言提供了#incude命令用来实现“文件包含”的操作。其一般形式为#incude“文件名”或#include<文件名>#include<filec>filecABBfilec这种常用在文件头部的被包含的文件称为“标题文件”或“头部文件”常以“h”为后缀(h为head(头)的缩写)如“stdioh”文件。当然不用“h”为后缀而用“c”为后缀或者没有后缀也是可以的但用”h”作后缀更能表示此文件的性质。说明:()一个include命令只能指定一个被包含文件如果要包含n个文件要用n个include命令()如果filec文件包含fileh文件而文件fileh要用到fileh的内容则可在filec用两个include命令分别包含文件fileh和fileh而且fileh应出现在fileh之前。即:#include“fileh”#include“fileh”这样filec和fileh都可以用到fileh的内容并且file中不用声明#include“fileh”。()文件包含可以嵌套()在#include命令中文件名可以使用双引号或尖括号括起来如果要包含的是用户自己编写的文件建议使用双引号()被包含文件(fileh)与其所在的文件(filec)在预编译之后已成为同一个文件。因此在fileh中有全局静态变量它在filec中有效不必用extern声明。条件编译条件编译一般情况下源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件下才进行编译这就是“条件编译”。条件编译的形式有:()#ifdef标识符程序段#else程序段#endif它的作用是当所指定的标识符已经被#define命令定义过则在程序编译阶段只编译程序段否则编译程序段。其中#else部分可以没有即#ifdef标识符程序段#endif这里的“程序段”可以是语句组也可以是命令行。这种条件编译对于提高C源程序的通用性是很有好处的。如果一个C源程序在不同计算机系统上运行而不同的计算机又有一定的差异(例如有的机器以位来存放一个整数而有的则以位存放一个整数)这样往往需要对源程序作必要的修改这就降低了程序的通用性可以用以下的条件编译来处理。#ifdefCOMPUTERA#defineINTEGERSIZE#else#defineINTEGERSIZE#endif如果COMPUTERA在前面已被定义过则编译下面的命令行:#defineINTEGERSIZE否则编译下面的命令行:#defineINTEGERSIZE如果在这组条件编译命令之前曾出现以下命令行:#defineCOMPUTERA或将COMPUTERA定义为任何字符串甚至是:#defineCOMPUTERA则预编译后程序中的INTEGERSIZE都用代替否则都用代替。这样源程序可以不必作任何修改就可以用于不同类型的计算机系统。例如在调试程序时常常希望输出一些所需的信息而在调试完成后不再输出这些信息。可以在源程序中插入以下的条件编译段。#indefDEBUGprintf(“x=d,y=d,z=dn”,x,y,z)#endif如果在它的前面有以下命令了行:#defineDEBUG则在程序运行时输出x,y,z的值以便调试时分析。调试完成后只需将这个define命令行删去即可。当然也可用printf语句实现这样的功能但却麻烦的多。()#ifndef标识符程序段#else程序段#endif它的作用是当所指定的标识符未被#define命令定义过则在程序编译阶段只编译程序段否则编译程序段。它只是第一行与第一种形式不同。这种形式与第一种形式的作用相反。以上两种形式用法差不多根据需要任选一种视方便而定。()#if表达式程序段#else程序段#endif它的作用是当指定的表达式值为真(非零)时就编译程序段否则编译程序段。可以事先给定一定条件使程序在不同的条件下执行不同的功能。不用条件编译命令而直接用if语句也能达到要求用条件编译命令的好处在于:可以减少被编译的语句从而减少目标程序的长度减少运行时间。当条件编译段比较多时目标程序长度可以大大减少。

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/20

09_第09章 预处理命令

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利