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

上传人:上海哈登 文档编号:2808568 上传时间:2019-05-20 格式:PPT 页数:17 大小:111.01KB
返回 下载 相关 举报
2019C华南农业大学c语言课件第8章.ppt_第1页
第1页 / 共17页
2019C华南农业大学c语言课件第8章.ppt_第2页
第2页 / 共17页
2019C华南农业大学c语言课件第8章.ppt_第3页
第3页 / 共17页
2019C华南农业大学c语言课件第8章.ppt_第4页
第4页 / 共17页
2019C华南农业大学c语言课件第8章.ppt_第5页
第5页 / 共17页
点击查看更多>>
资源描述

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

1、本章主要内容 1.掌握无参宏定义和带参宏定义的方法。 2.掌握文件包含命令的形式和文件包含的实现过程。 3.掌握条件编译命令的形式及嵌套。,第8章 编译预处理,C提供的预处理功能主要有以下三种: 宏定义 文件包含 条件编译 所有的预处理语句均以“#”开头,占用一个单独的书写行,语句的结尾不用分号“;” 结束。,8.1 宏定义,8.1.1 无参数宏定义 无参数宏定义的一般形式: #define 标识符 字符串(常量或代码串) 例:#define PI 3.1415926 作用:用PI来代表“3.1415926”。以一个简单的名字代替长的符号串。称这个标识符为“宏名”,在编译时将宏名替换成字符串的

2、过程称为“宏展开”。 #define 是宏定义命令。,例:从键盘输入字符(个数不多于100),欲统计输入字符中英 文字母的个数。 注:输入字符#时,或输入字符个数多于100时,输入结束。 #include “stdio.h“ #define MAX 100 main( ) int n, count=0; char ch; for(n=0; n=a ,无参宏定义说明:,为了使宏名和变量名相区别。通常宏名用大写字母表示。 符号常量不仅可以定义常数,也可以定义字符、字符串、说明符号。 如: #define ENDSTRING 0 如果程序中用双引号括住的字符串内包含与符号常量有相同的名字,预编译时并

3、不进行宏替换。 如: #define BOOK “The Red and The Black” main() printf(“%ns“, BOOK); 运行结果: The Red and The Black 如果将程序改为: #define BOOK “The Red and The Black” main() printf(“%ns“, “BOOK”); 运行结果: BOOK,无参宏定义说明(续):,宏定义语句的末尾不必加分号。 例如:#define MAXIMUM 20; 错误 if(max= =MAXIMUM) break; 经过宏展开后,其中的if语句变为: if(max= =20;)

4、 break; 显然,上述if语句存在语法错误。 在字符串中若出现运算符,通常需在合适的位置加括号。 例如:#define S (3+4) 可以用#undef命令取消宏定义。 一般形式:#undef 标识符,8.1.2带参宏定义 带参宏定义的一般形式: #define 标识符(形参表) 字符串 其中,形参表是由一个或多个形参组成。 带参宏调用的一般形式: 宏名(实参表);,例:编写一个程序,求3个数中的最大数,要求用带参数的宏实现。 #include #define MAX1(a,b) (a)(b)?(a):(b) #define MAX2(a,b,c) (MAX1(a,b)(c)?MAX1(

5、a,b):(c) main() int a=23; printf(“MAX=%dn“,MAX2(13+5,4,a); ,带参数的宏与函数有本质上的区别 : 函数在定义和调用中所使用的形参和实参都受数据类型的限制,而带参数宏的形参和实参可以是任意数据类型。 函数有一定的数据类型,且数据类型是不变的。而带参数的宏一般是一个运算表达式,它没有固定的数据类型。 函数调用时,先计算实参表达式的值,然后带入形参。而宏定义展开时,只是替换。 函数调用是在程序运行时处理的,将分配临时的存储单元。而宏扩展是在编译时进行的,展开时即不分配内存单元,不传递值,也没有“返回值”的概念。 使用宏次数多时,宏展开后源程序

6、增长,而函数调用不使源程序变长。,使用带参数的宏,应注意: 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; 显然与原题意不符。 2. 宏名与括号之间不能有空格。 #defineS(r) PI*r*r,错,8.2 文件包含,文件包含也是一种预处理语句,它的作用是使一 个源程

7、序文件将另一个源程序文件的全部包含进 来。一般形式为: #include 或 #include “文件名”,“文件包含”示意图,file1.c file2.c file1.c 包含 #include”file2.c” B A B A (a) (b) (c),8.3条件编译,8.3.1条件编译命令的形式 常用的有三种形式: 形式一: #ifdef 宏名 程序段1; #else 程序段2; #endif,或者: #ifdef 宏名 程序段; #endif,8.3.1条件编译命令的形式( 续) 形式二: #ifndef 宏名 程序段1; #else 程序段2; #endif 其中,# ifndef语

8、句的功能与# ifdef相反,如果宏名未定义则编译程序段1,否则编译程序2。,或者: #ifndef 宏名 程序段; #endif,8.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,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1