C华南农业大学c语言课件第8章

上传人:仙*** 文档编号:40264538 上传时间:2021-11-15 格式:PPT 页数:17 大小:111.02KB
收藏 版权申诉 举报 下载
C华南农业大学c语言课件第8章_第1页
第1页 / 共17页
C华南农业大学c语言课件第8章_第2页
第2页 / 共17页
C华南农业大学c语言课件第8章_第3页
第3页 / 共17页
资源描述:

《C华南农业大学c语言课件第8章》由会员分享,可在线阅读,更多相关《C华南农业大学c语言课件第8章(17页珍藏版)》请在装配图网上搜索。

1、 本章主要内容本章主要内容1.掌握无参宏定义和带参宏定义的方法。掌握无参宏定义和带参宏定义的方法。2.掌握文件包含命令的形式和文件包含的实现过程。掌握文件包含命令的形式和文件包含的实现过程。3.掌握条件编译命令的形式及嵌套。掌握条件编译命令的形式及嵌套。 第第8章章 编译预处理编译预处理 C提供的预处理功能主要有以下三种:提供的预处理功能主要有以下三种:( 宏定义宏定义( 文件包含文件包含(条件编译条件编译 所有的预处理语句均以所有的预处理语句均以“#”开头,占用一个单独的开头,占用一个单独的书写行,语句的结尾不用分号书写行,语句的结尾不用分号“;” 结束。结束。8.1 宏定义宏定义8.1.1

2、 无参数宏定义无参数宏定义无参数宏定义的一般形式:无参数宏定义的一般形式:#define 标识符标识符 字符串字符串(常量或代码串常量或代码串)例:例:#define PI 3.1415926作用:用作用:用PI来代表来代表“3.1415926”。以一个简单的名字代。以一个简单的名字代替长的符号串。称这个标识符为替长的符号串。称这个标识符为“宏名宏名”,在编译时,在编译时将宏名替换成字符串的过程称为将宏名替换成字符串的过程称为“宏展开宏展开”。 #define 是宏定义命令。是宏定义命令。例例:从键盘输入字符(个数不多于从键盘输入字符(个数不多于100),欲统计输入字符中英),欲统计输入字符中

3、英文字母的个数。文字母的个数。注:输入字符注:输入字符#时,或输入字符个数多于时,或输入字符个数多于100时,输入结束。时,输入结束。#include stdio.h#define MAX 100main( ) int n, count=0; char ch; for(n=0; n=a&ch=A&ch=Z) count+ +; printf(The number of letters:%dn, count); 无参宏定义说明:无参宏定义说明:A为了使宏名和变量名相区别。通常宏名用大写字母表示。为了使宏名和变量名相区别。通常宏名用大写字母表示。A符号常量不仅可以定义常数,也可以定

4、义字符、字符串、说明符号。符号常量不仅可以定义常数,也可以定义字符、字符串、说明符号。 如如: #define ENDSTRING 0 A如果程序中用双引号括住的字符串内包含与符号常量有相同的名字,预编译如果程序中用双引号括住的字符串内包含与符号常量有相同的名字,预编译时并不进行宏替换。时并不进行宏替换。如:如:#define BOOK “The Red and The Black” main() printf(%ns, BOOK); 运行结果:运行结果:The Red and The Black如果将程序改为如果将程序改为:#define BOOK “The Red and The Blac

5、k” main() printf(%ns, “BOOK”); 运行结果:运行结果:BOOK无参宏定义说明无参宏定义说明(续续):A 宏定义语句的末尾不必加分号。宏定义语句的末尾不必加分号。 例如:例如:#define MAXIMUM 20; 错误错误 if(max= =MAXIMUM) break; 经过宏展开后,其中的经过宏展开后,其中的if语句变为:语句变为: if(max= =20;) break; 显然,上述显然,上述if语句存在语法错误。语句存在语法错误。A 在字符串中若出现运算符,通常需在合适的位置加括号。在字符串中若出现运算符,通常需在合适的位置加括号。 例如:例如:#defin

6、e S (3+4)A 可以用可以用#undef命令取消宏定义。命令取消宏定义。 一般形式:一般形式:#undef 标识符标识符8.1.2带参宏定义带参宏定义带参宏定义的一般形式:带参宏定义的一般形式:#define 标识符标识符(形参表形参表) 字符串字符串其中,形参表是由一个或多个形参组成。其中,形参表是由一个或多个形参组成。带参宏调用的一般形式:带参宏调用的一般形式: 宏名宏名(实参表实参表);例:编写一个程序,求例:编写一个程序,求3个数中的最大数,要求用带参数个数中的最大数,要求用带参数的宏实现。的宏实现。 #include #define MAX1(a,b) (a)(b)?(a):(

7、b) #define MAX2(a,b,c) (MAX1(a,b)(c)?MAX1(a,b):(c) main() int a=23; printf(MAX=%dn,MAX2(13+5,4,a); 带参数的宏与函数有本质上的区别带参数的宏与函数有本质上的区别 : 函数在定义和调用中所使用的形参和实参都受数据函数在定义和调用中所使用的形参和实参都受数据类型的限制,而带参数宏的形参和实参可以是任意类型的限制,而带参数宏的形参和实参可以是任意数据类型。数据类型。 函数有一定的数据类型,且数据类型是不变的。而函数有一定的数据类型,且数据类型是不变的。而带参数的宏一般是一个运算表达式,它没有固定的带参数

8、的宏一般是一个运算表达式,它没有固定的数据类型。数据类型。 函数调用时,先计算实参表达式的值,然后带入形函数调用时,先计算实参表达式的值,然后带入形参。而宏定义展开时,只是替换。参。而宏定义展开时,只是替换。 函数调用是在程序运行时处理的,将分配临时的存函数调用是在程序运行时处理的,将分配临时的存储单元。而宏扩展是在编译时进行的,展开时即不储单元。而宏扩展是在编译时进行的,展开时即不分配内存单元,不传递值,也没有分配内存单元,不传递值,也没有“返回值返回值”的概的概念。念。 使用宏次数多时,宏展开后源程序增长,而函数调使用宏次数多时,宏展开后源程序增长,而函数调用不使源程序变长。用不使源程序变

9、长。使用带参数的宏,应注意:使用带参数的宏,应注意: 1.对于宏定义的形参要根据需要加上圆括号,以免发生运算错误。对于宏定义的形参要根据需要加上圆括号,以免发生运算错误。 #define MULTI(x) (x)*(x) a=15; b=3; p= MULTI(a+b)*10; 经过预编译,该赋值语句变为:经过预编译,该赋值语句变为: p=(a+b)*(a+b)*10; 如果定义中没有使用相应的括号,定义为:如果定义中没有使用相应的括号,定义为: #define MULTI(x) (x*x) 预编译后的赋值语句变为:预编译后的赋值语句变为: p=a+b*a+b*10; 显然与原题意不符。显然与

10、原题意不符。 2. 宏名与括号之间不能有空格。宏名与括号之间不能有空格。 #defineS(r) PI*r*r错8.2 文件包含文件包含文件包含也是一种预处理语句,它的作用是使一文件包含也是一种预处理语句,它的作用是使一个源程序文件将另一个源程序文件的全部包含进个源程序文件将另一个源程序文件的全部包含进来。一般形式为:来。一般形式为:#include 或或 #include “文件名文件名”“文件包含文件包含”示意图示意图 file1.c file2.c file1.c 包含#include”file2.c” B A B A (a) (b) (c)8.3条件编译条件编译8.3.1条件编译命令的

11、形式条件编译命令的形式 常用的有三种形式:常用的有三种形式: 形式一:形式一: #ifdef 宏名宏名 程序段程序段1; #else 程序段程序段2; #endif 或者:或者:#ifdef 宏名宏名 程序段;程序段;#endif8.3.1条件编译命令的形式条件编译命令的形式( 续续) 形式二:形式二: #ifndef 宏名宏名 程序段程序段1; #else 程序段程序段2; #endif其中,其中,# ifndef语句的功能与语句的功能与# ifdef相反,如果宏名相反,如果宏名未定义则编译程序段未定义则编译程序段1,否则编译程序,否则编译程序2。 或者:或者:#ifndef 宏名宏名 程序

12、段;程序段;#endif8.3.1条件编译命令的形式条件编译命令的形式( 续续) 形式三:形式三: #if 常数表达式常数表达式 程序段程序段1; #else 程序段程序段2; #endif 功能:首先计算功能:首先计算“常数表达式常数表达式”的值,如果为真的值,如果为真(非零),就编译(非零),就编译“程序段程序段1”,否则编译,否则编译“程序程序段段2”。如果没有。如果没有#else部分,则当部分,则当“常数表达式常数表达式”的值为的值为0时,直接跳过时,直接跳过#endif。或者:或者:#if 常数表达式常数表达式 程序段;程序段;#endif例:阅读程序。例:阅读程序。#include main() #if NULL printf(NULL is non-zero value!n); #else printf(NULL is zero value!n); #endif运行结果:运行结果:NULL is zero value!8.3.2条件编译命令的嵌套条件编译命令的嵌套条件编译可以嵌套使用,如:条件编译可以嵌套使用,如:#if 表达式表达式1程序段程序段1;#else#if 表达式表达式2 程序段程序段2;#else 程序段程序段3;#endif#endif

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

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

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


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