教学材料《C语言》-项目八 认识编译预处理_第1页
已阅读1页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

任务一

使用宏定义一、无参数宏无参宏定义通常用来定义符号常量,即用一指定的宏名(标识符)来代表一个字符串,一般形式为:

#define宏名字符串这就是已经介绍过的定义符号常量。如:

#definePI3.1415926

它的作用是指定用标识符PI来代替“3.1415926”这个字符串。在编译预处理时,将程序中在该命令以后出现的所有的PI都用“3.1415926”代替。该过程称为宏展开。下一页返回任务一

使用宏定义

宏定义中宏名常用大写字母表示,宏名与字符串之间用空格分隔。#define是宏定义命令。其中字符串可以是一个数值型数据、表达式或字符串。例如:

#defineA100#definePRprintf#defineB(30-(2*6))

#defineS(A*B)上一页下一页返回任务一

使用宏定义例8.1从键盘连续输入字符,统计其中的大写字母的个数,直到按ESC键结束。

#include“stdio.h”#defineESC27main(){intcount=0;charc;while((c=getch())!=ESC)if(c>=’A’&&c<=’Z’)count++;printf(“count=%d”,count);}上一页下一页返回任务一

使用宏定义

其中,预处理程序将此程序中凡是出现ESC的地放都用27替换。如果ESC的编码值有所变化,只需修改宏定义语句即可,这样有助于程序的调试和移植。上一页下一页返回任务一

使用宏定义使用符号常量应注意的事项:(1)预处理模块只是用宏名作简单的替换,不作语法检查,若字符串有错误,只有在正式编译时才能检查出来。(2)没有特殊的需要,一般在预处理语句的行末不加分号,若加了分号,则连同分号一起替换。(3)使用宏定义可以减少程序中重复书写字符串的工作量,提高程序的可移植性。(4)宏定义命令一般写在文件开头、函数之前,作为文件的一部分,宏名的有效范围为宏定义之后到本源文件结束。如果要强制终止宏定义的作用域,可以使用#undef命令。(5)定义符号常量时,可以引用已定义的符号常量。(6)程序中用双括号括起来的字符串中的字符,若与符号常量同名,不进行替换。上一页下一页返回任务一

使用宏定义二、有参数宏利用#define命令不仅可以定义符号常量,也可以定义带参数的宏。一般形式为:

#define宏名(参数表)字符串字符串中也包含参数表中的参数,该参数为形参。预编译程序根据宏定义用字符串替换程序中出现的带参数的宏,其中定义式中的形式参数用相应的实际参数替换,实参可以是常量、变量或表达式;若字符串中的某个字符不是形参,则在替换时保留。上一页下一页返回任务一

使用宏定义例8.3从键盘输入两个数,输出较大的数。#defineMAX(a,b)((a)>(b)?(a):(b))main(){intx,y;printf(“输入两个数:”);scanf(“%d,%d”,&x,&y);printf(“MAX=%d”,MAX(x,y));}

以上程序执行时,用字符串“((a)>(b)?(a):(b))”来替换MAX(a,b)。所以,可以输出两个数的较大者。上一页下一页返回任务一

使用宏定义

在程序设计中,经常要把反复使用的运算表达式定义为带参的宏。例如:#defineMIN(a,b)((a)<(b)?(a):(b))/*求两个数中的较小者*/#definePER(a,b)(100.0*(a)/(b))/*求a是b的百分之几*/#defineABS(x)((x)>=0)?(x):(-x)/*求x的绝对值*/#defineISO(x)(((x)%2==1)?1:0)/*判断x是否为奇数*/#defineCHANGE(a,b){intt;t=a;a=b;b=t;}/*两个整数交换*/上一页下一页返回任务一

使用宏定义使用有参宏应注意的事项:(1)对宏定义中的替代字符串及其所包含的参数,根据需要加上圆括号,以免发生运算错误。(2)宏定义时,不要在宏名与带参数的括号之间留空格,否则,空格之后的字符串都将视为替代字符串。(3)把函数和有参宏要区分开,虽然它们有相似之处,但有所不同,其区别见表8-1所示。上一页返回任务二

使用文件包含

文件包含

在前面章节所编写的程序中,经常会有下面的写法:

#include<stdio.h>或#include“math.h”

其含义是在编译时,用stdio.h或math.h头文件的内容替换该语句。文件包含是指一个源文件可以将另外一个源文件的全部内容包含进来,即将另一个C语言的源程序文件嵌入正在进行预处理的源程序中相应位置,一般形式为:

#include<文件名>或#include“文件名”其中“文件名”指被嵌入的源程序文件,其扩展名是“.h”或“.c”。下一页返回任务二

使用文件包含

这种常用在文件头部的被包含的文件称为“标题文件”或“头部文件”,常以“.h”为后缀(h为head的缩写),当然不用“.h”为后缀而用“.c”为后缀也可以,而用“.h”作后缀更能表示文件的性质。另外“文件名”必须用尖括号或双引号括起来:当使用尖括号时,表示预处理程序在规定的磁盘目录(通常为include子目录)查找文件;当使用双引号时,表示预处理程序首先在当前目录中查找文件,若找不到,再去include子目录中查找。上一页下一页返回任务二

使用文件包含例8.6(1)文件pformat.h#definePRprintf#defineNL“\n”#defineD“%d”#defineD1DNL#defineD2DDNL#defineD3DDDNL#defineD4DDDDNL#defineS“%s”上一页下一页返回任务二

使用文件包含(2)文件file.c#include<stdio.h>#include<pformat.h>main(){inta,b,c,d;charstring[]=“STUDENT”a=1;b=2;c=3;d=4;PR(D1,a);PR(D2,a,b);PR(D3,a,b,c);PR(D4,a,b,c,d);PR(S,string);}上一页下一页返回任务二

使用文件包含

文件包含命令是很有用的命令,特别是对包括多个源文件的大程序来说,可以把各个源文件中共同使用的函数说明、符号常量定义、外部量说明、宏定义和结构类型定义等写成一个独立的包含文件。在需要这些说明的源文件中,只需在源文件的开头用一个#include命令把该文件包含进来,这样就可以减少不必要的重复工作,提高工作效率。上一页下一页返回任务二

使用文件包含使用#include命令要注意以下几点:(1)一个#include命令只能指定一个被包含文件,若包含n个则需要n个#include命令。(2)若#include命令指定的文件内容发生变化,则应该对包含此文件的所有源文件重新编译处理。(3)文件包含命令可以嵌套。上一页返回表8-1函数和有参宏的区别区别类

温馨提示

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

最新文档

评论

0/150

提交评论