南理工 c语言 第九章 预处理命令.ppt_第1页
南理工 c语言 第九章 预处理命令.ppt_第2页
南理工 c语言 第九章 预处理命令.ppt_第3页
南理工 c语言 第九章 预处理命令.ppt_第4页
南理工 c语言 第九章 预处理命令.ppt_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

1、第九章 预处理命令,C语言程序设计,2,本章主要内容,宏定义 文件包含 条件编译,3,预处理命令,预处理命令是指编译程序前事先对程序进行的加工处理工作 操作:由编译系统中的预处理程序进行 目的:改进程序设计环境,提高编程效率 语法: 由#开头的关键字,末尾不加分号 位置:程序的任何位置,4,预处理命令,预处理命令分类: 宏定义:用宏来代替指定内容 文件包含:将另一个文件的内容复制到本文件 条件编译:一部分内容满足条件后才编译,5,9.1 宏定义,宏定义是用指定标识符来代替程序中的相应内容 宏定义使用关键字define 分类: 不带参的宏:简单字串替换 带参的宏:有参数传递替换,宏定义,6,9.

2、1 宏定义,不带参的宏直接用指定标识符代替程序中的内容(视为字符串) 格式: #define 宏名 宏替换体(字符串) 例:#define PI 3.1415926 功能: 将程序中所有宏名用宏替换体代替 说明: 宏名是标识符,不得与其它变量等同名,不带参的宏,7,9.1 宏定义,例TC9.1-1.c 求半径为r的圆的周长、面积及球体体积 #include #define PI 3.1415926 void main( ) float l,s,r,v; printf( input radius: ); scanf( %f, ,不带参的宏,8,9.1 宏定义,注意: 宏定义作用域为定义点至文件尾

3、 同一作用域内宏不能同名 为与变量区别,通常用大写字母命名宏 宏定义不是C语句,末尾不能加分号 例: #define PI 3.1415926; 宏定义仅为简单替代,不检查语法错误 可用:# undef 宏名 命令终止宏定义的执行,不带参的宏,9,9.1 宏定义,注意: 可以利用已有的宏来定义新宏 #define PI 3.1415926 /* TC9.1-2.C */ #define R 3.0 #define L 2. *PI * R #define S PI * R * R void main( ) printf( L=%10.4fnS=%10.4fn , L, S ); 注意:双引号内

4、的不是宏名是字符串,不予替换,不带参的宏,10,9.1 宏定义,注意: 宏替换体还可以是表达式或C语句 例: #define PRx printf( %dn,x) int x = 2, y, z; x* = y = z = 4; PRx; x = y = z; PRx; x = ( y = z ); PRx;,结果为: 8 1 1,不带参的宏,11,9.1 宏定义,带参的宏利用形参进行灵活的替换 格式: #define 宏名(形参表) 宏替换体 例:#define S( a, b ) a * b 功能: 将程序中所有宏名用宏替换体代替,同时将宏替换体中的形参用实参代替,带参的宏,12,9.1

5、宏定义,例TC9.1-3.C 求矩形面积 #include #define S( a, b ) a * b void main( ) float x = 3.6, y = 2.0, area; area = S( x, y ); printf( area = %fn , area ); ,带参的宏,系统替换为:x * y,结果为: 7.2,13,9.1 宏定义,说明: 实参可以是常量、变量或表达式 例:area = S( x+1, y+1 ); 注意:常量是表达式时可能带来麻烦 上例代换结果:area = x + 1 * y + 1 = x + y + 1 解决办法:形参加括号 #define

6、 S( a, b ) (a) *( b) 代换结果:area = ( x + 1 ) * ( y + 1 ) 宏名和形参表间不可有括号 例: #define S ( a, b ) (a) *( b),带参的宏,14,9.1 宏定义,可将一些简单函数改为带参的宏 例:用带参的宏将两个变量值交换 #include /* TC9.1-6.c */ #define Swap( a, b ) t = a; a = b; b = t; void main( ) int x = 5, y = 10, t; printf( x= %d y= %dn, x, y ); Swap( x, y ); printf(

7、 x= %d y= %dn, x, y ); ,带参的宏,运行结果: x=5 y=10 x=10 y=5,15,9.1 宏定义,相同点: 都有形参和实参,并按位置进行虚实结合 形、实参个数要求相同 区别: 实参为表达式时 函数调用:先求出实参表达式的值再虚实结合 带参的宏:直接字串替换 数据类型 函数:形、实参必须类型一致,函数有返回值 宏:没有类型和返回值,带参的宏与函数调用,16,9.1 宏定义,执行过程 函数:在程序运行阶段执行,形参有存储单元 宏:在编译之前进行替换,没有存储单元 结果: 函数:只有一个返回值 宏:可得到多个结果 效率: 函数:占用内存和运行时间 宏:只占编译时间,不占

8、内存,但程序会加长 总结: 函数:执行复杂计算 宏:适合代表较简短的一个或多个表达式,带参的宏与函数调用,实例1,实例2,17,9.1 宏定义,例TC9.1-4.C带参的宏带回多个结果 #include #define PI 3.1415926 #define CIRCLE( R, L, S, V ) L = 2.*PI*R; S = PI*R*R; V = 4.0/3.0 *PI*R*R*R void main( ) float r, l, s, v; scanf( %f, ,带参的宏与函数调用,返回,18,9.1 宏定义,例TC9.1-5.C 带参的宏的副作用函数篇 #include in

9、t Square( int n ); void main( ) int i = 1; while( i = 10) printf( %dn , Square( i+ ) ); int Square( int n ) return n * n; ,带参的宏与函数调用,结果: 1 4 9 16 25 36 49 64 81 100,返回,19,9.1 宏定义,例TC9.1-5A.C 带参的宏的副作用 #include #define Square( n ) (n) * (n) void main( ) int i = 1; while( i = 10) printf( %dn , Square(

10、i+ ) ); ,带参的宏与函数调用,结果: 1 9 25 49 81,代换为:( i+ ) * ( i+ ) i+ 优先级高且要执行两次,20,9.2 文件包含,文件包含是指将另一个文件的内容复制到本程序写有文件包含语句处 格式: #include 文件名 或 #include 区别: 形式1:先在当前文件夹中查找文件,再去系统指定文件夹中查找此文件 形式2:直接去系统文件夹查找文件,不带参的宏,21,9.2 文件包含,说明: 由于被包含文件通常放在文件的开头,内容一般为数据定义,宏和函数声明。所以这些文件一般以“.h”为文件扩展名,称为头文件。 普通文件亦可被包含,22,9.2 文件包含,

11、注意: 一句#include只能指定包含一个文件 被包含文件与所在文件在预处理后已成为一个文件,文件中如有全局变量可直接使用,不必加extern说明。 文件包含可以嵌套但请注意文件次序。,23,文件1: /*TC9.2-1A.C */ #include #include TC92-1C.C #include TC92-1B.C void main( ) printf(1: x=%d y=%dn, x, y ); y = 246; gx( ); gy( x ); ,文件包含实例,9.2 文件包含,24,文件2:/*TC9.2-1B.C */ void gx( ) x = 135; printf(

12、2: x=%d y=%dn, x, y ); ,多文件使用实例,文件3: /*TC9.2-1C.C */ int x, y; void gy( int y ) printf(1: x=%d y=%dn, x, y ); ,9.2 文件包含,25,条件编译是指根据一定的条件编译源文件的不同部分,得到不同的代码 条件编译有几种常用形式 #if 常量表达式 /当“ 常量表达式”非零时编译 程序正文 #endif 例:#define MAX 120 #if MAX 100 #define DY 50 #endif,9.3 条件编译,条件编译,26,9.3 条件编译,格式二: #if 常量表达式 /*

13、当“ 常量表达式”非零时编译 */ 程序正文1 #else /*当“ 常量表达式”为零时编译 */ 程序正文2 #endif,条件编译,/* TC9.3-1.C 条件编译 */ #include #define LETTER 1 void main( void ) char str20 = C Language, c; int i = 0; while( (c = stri) != 0 ) i+; #if LETTER if( c = a ,条件编译实例,结果为: C LANGUAGE,28,格式三: #if 常量表达式1 程序正文1 /*当“ 常量表达式1”非零时编译*/ #elif 常量表达式2 程序正文2 /*当“ 常量表达式2”非零时编译*/

温馨提示

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

最新文档

评论

0/150

提交评论