第9章 预处理命

上传人:痛*** 文档编号:244582669 上传时间:2024-10-05 格式:PPT 页数:18 大小:220KB
返回 下载 相关 举报
第9章 预处理命_第1页
第1页 / 共18页
第9章 预处理命_第2页
第2页 / 共18页
第9章 预处理命_第3页
第3页 / 共18页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第九章 预处理命令,C,语言与其他高级语言的一个重要区别是可以使用预处理命令和具有预处理的功能。,C,提供的预处理功能有三种:,宏定义,文件包含,条件编译,分别用宏定义命令、文件包含命令、条件编译命令来实现。这些命令都以“,#”,号开头。,9.1,宏定义,9.1.1,不带参数的宏定义,用一个指定的标识符来代表一个字符串。,形式:,#define,标识符 字符串,#define PI 3.1415926,/*PI,是宏名,,3.1415926,用来替换宏名的常数*,/,main(),float,l,a,r,v,;,printf(Input,a radius:);,scanf(%f,&r,);,l=2.0*PI*r;,/*,引用无参宏求周长*,/,a=PI*r*r;,/*,引用无参宏求面积*,/,v=PI*r*r*r*3/4;,/*,引用无参宏求体积*,/,printf(leng,=%.2f,area=%.2f,volu=%.2fn,l,a,v);,说明:,1,)宏名一般用大写字母表示,但也可以用小写书写;,2,)宏定义使用宏名代替一个字符串,只是简单的置换,不做正确性检查。,#define PI 3.14,I,59,3,)宏定义不用加分号;如果使用分号,分号会一起置换;,4,)可以用,#,undef,命令终止宏定义的作用域。,例如:,#define G 9.8,/*,宏定义,C,语句,不必在行末尾加分号*,/,main(),undef,G,f1(),/*,在函数,f1,中,G,不起作用*,/,5,)可以引用已定义的宏名,层层置换。,#define R 3.0,#define PI 3.1415926,#define L 2*PI*R,#define S PI*R*R,main(),printf(“L,=%,fnS,=%,fn,”,L,S);,/*,双引号内的不做替换*,/,6,)系统不对宏名分配存储单元。,9.1.2,带参数的宏定义,形式:,#define,宏名(参数表)字符串,例如:,#define,S(a,b,)a*b,area=S(3,2);,以,3,、,2,分别代替宏定义中的形参,a,、,b,,,即用,3*2,代替,S,(,3,,,2,)。,所以赋值语句展开为:,area=3*2;,作用:不是简单的字符串替换,还要进行参数替换。,例,9.3,#define PI 3.1415926,#define S(r)PI*r*r,main(),float a,area;,a=3.6;,area=S(a);,/*area=3.1415926*a*a */,printf(“r,=%,fnarea,=%fn”,a,area);,运行结果,:,r=3.600000,area=40.715038,说明:,(,1,)宏展开:如果是带有参数的宏(,S,(,3,,,2,),则按从左到右进行实形参的置换;如果字符串中有形参,则用实参代替形参;如果字符串中有非形参字符,则原样保留。,(,2,)定义有参宏时,宏名与左圆括号之间不能留有空格。否则编译系统将空格以后的所有字符均作为替代字符串,而将该宏视为无参宏。如:,#define S,(r)PI*r*r,(,3,)有参宏的展开,只是将实参作为字符串,简单地置换形参字符串,而不做任何语法检查。,如:,#define,S(r,)PI*r*r,area=,S(a+b,);,area=PI*,a+b,*,a+b,;,#define,S(r,)PI*(r)*(r),在定义有参宏时,在所有形参外和整个字符串外,均加一对圆括号。,虽然有参宏与有参函数有相似之处,但也有,不同之处:,1,)调用有参函数时,是先求出实参的值,然后再传递给形参。而展开有参宏时,只是将实参简单地置换形参。,2,)函数调用是在程序运行时为形参分配临时的存储单元,而宏展开并不分配存储单元,不是值的传递,只是简单替换。,3,)在有参函数中,形参是有类型的,所以要求实参的类型与其一致;而在有参宏中,形参是没有类型信息的,因此用于置换的实参,可以是任何类型。,4,),调用函数只能得到一个返回值,而用宏可以设法得到几个结果。,祥见例,9.4,5,)宏展开会使程序变长,而函数调用则不会。,6,)宏替换不占运行时间,只占编译时间,而函数调用则占运行时间。,9.2,文件包含处理,“文件包含”处理是指一个源文件将另一个源文件的全部内容包含进来。,形式:,#include,标准形式,或,#include“,文件名”,例如以前用过的:,#include,数学头函数,#include,输入,/,输出头函数,作用:可以节省程序设计人员的重复劳动。,文件包含的优点,:,一个大程序,通常分为多个模块,并由多个程序员分别编程。有了文件包含处理功能,就可以将多个模块共用的数据(如符号常量和数据结构)或函数,集中到一个单独的文件中。这样,凡是要使用其中数据或调用其中函数的程序员,只要使用文件包含处理功能,将所需文件包含进来即可,不必再重复定义它们,从而减少重复劳动。,说明,(,1,)编译预处理时,预处理程序将查找指定的被包含文件,并将其复制到,#include,命令出现的位置上。,(,2,)常用在文件头部的被包含文件,称为“标题文件”或“头部文件”,常以“,h”,(,head,),作为后缀,简称头文件。在头文件中,除可包含宏定义外,还可包含外部变量定义、结构类型定义等。,(,3,)一条包含命令,只能指定一个被包含文件。如果要包含,n,个文件,则要用,n,条包含命令。,(,4,)文件包含可以嵌套,即被包含文件中又包含另一个文件。,例,9,、,6,(,1,)文件,format.h,#define PR,pirntf,#define NL“n”,#define D“%d”,#define D1 D NL,#define D2 D D NL,#define D3 D D D NL,#define D4 D D D D NL,#define S“%s”,file1.c,#define“format.h”,main(),int,a,b,c,d;,char string=“CHINA”;,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);,运行结果,:,1,12,123,1234,CHINA,9.3,条件编译,当希望程序中某部分内容只在满足一定条件时才进行编译,不满足条件则不编译,这就是“条件编译”。,形式:,(,1,),#,ifdef,标识符,程序段,1,else,程序段,2,#,endif,若标识符已被,#define,命令定义过,则编译程序,1,,否则编译程序,2,(2),#,ifndef,标识符,程序段,1,#else,程序段,2,#,endif,这里,#,ifndef,和,#,ifdef,不同,与第一种形式相反。,若标识符未被,#define,命令定义过,则编译程序,1,,否则编译程序,2,(3),、,#if,表达式,程序段,1,#else,程序段,2,#,endif,例,9,、,7,输入一行字母字符,根据需要设置条件编译,使之能将字母全改为大写输出,或全改为小写输出。,当指定表达式值为真(非零)时就编译程序段,1,,否则编译程序段,2,。,程序如下:,#define LETTER 1,main(),char str20=“C language”,c;,int,I;,I=0;,While(c=,strI,)!=0),I+;,#if LETTER,if(ca&c=A&c=z),c=c+32;,#,endif,printf(“%c”,c,);,运行结果:,C LANGUAGE,上题如果将第一行改为:,#define LETTER 0,则在预处理时,对第二个,IF,语句处理,使大写变为小写。,应用条件编译命令有什么好处呢,?,如果不用条件编译处理,目标程序长,(因为对所有语句都进行编译),运行时间长(因为在程序运行时对,if,语句进行测试)。而采用条件编译,可以减少被编译的语句,从而减少目标程序的长度,减少运行时间。当条件编译段比较多时,目标程序长度可以大大减少。,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!