预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共11页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

第六章预处理 ★内容提要: 宏定义概念与定义形式 宏定义与函数调用的区别 文件包含 条件编译 宏定义 宏与函数的区别 文件包含 条件编译 编译时预处理是C语言区别于其它高级语言 的特征之一,即在通常的编译(包括词法、 语法、代码生成、优化等)之前,先对程序 中的特殊命令进行“预处理”,然后再进行编 译。 ⑴宏定义; 预处理功能主要有三种: ⑶条件编译。⑵文件包含; 第六章预处理 9.1宏定义 #define宏名替换字符串 宏定义的一般格式: #define宏名替换字符串 宏定义的一般格式: 宏定义就是用一个宏名代替一个字符 串,以简化编程,提高程序的可读性; 注意:宏名必须定义在前引用在后, 其后不要加“;”号。 宏定义指令的最终作用是要求预编译器 在源程序中寻找宏名,并将所有的这些 “宏名”用“替换字符串”替换。 #define宏名替换字符串 宏定义的一般格式: #define宏名替换字符串 宏定义的一般格式: 运行结果: area=28.274333 运行结果: area=28.274333 9.2带参的宏定义 说明:相应实参可以是较复杂的表达式,此时为得到 正确的结果,应当在替换字符串的形式参数外面加上 一个括号。宏名与带参数的括号之间不应加空格,非 则将出错。 不仅可以进行简单的字符替换,还可以进行 参数替换,改参数可以是表达式。 #define宏名(参数)替换字符串 带参宏定义的一般格式: #define宏名(参数)替换字符串 带参宏定义的一般格式: 运行结果: area=40.715040 运行结果: area=40.715040 运行结果: area=66.476099 运行结果: area=66.476099 3.1415926*(a+1)*(a+1) 9.3正确区分在形式上相似的宏与函数的概念 设有以下: 带参的宏:S(a+1)函数调用:sqrt(a+1.5) 宏定义与函数调用的区别有: 先求表达式的值,然后 进行形实结合的数据传 递,返回一个值,有类 型的概念。 只作简单的字符替 换,不进行值的传 递,也没有返回值 和类型的概念 操作内容 在程序运行时处理在预编译时处理处理时间 函数调用带参宏定义 先求表达式的值,然后 进行形实结合的数据传 递,返回一个值,有类 型的概念。 只作简单的字符替 换,不进行值的传 递,也没有返回值 和类型的概念 操作内容 在程序运行时处理在预编译时处理处理时间 函数调用带参宏定义 #defineFUDGE(K)K+3.14159 #definePR(a)printf("%3d",(int)(a)) #definePRINT(a)PR(a);printf("%4d\n",++a) voidmain(){ inti,x=2; PR(x*FUDGE(2)); for(i=0;i或 #include“filename” 文件包含一般格式: #include或 #include“filename” 文件包含一般格式: 9.4文件包含 说明:filename可以是: “*.c”源程序等文件,即另一个指定文 件的全部内容。 文件包含是指将另外的文件包含到本文件之中 #include或 #include“filename” 文件包含一般格式: #include或 #include“filename” 文件包含一般格式: 执行结果执行结果 模块A #include 模块B math.h file1.c 预编译 模块A #include 模块B math.h file1.c 预编译 模块A 模块B 模块A 模块B 编译编译 目标 模块 可执行 程序 库函数 或其它目 标程序 链接 目标 模块 可执行 程序 库函数 或其它目 标程序 链接 运行运行 C程序的编 译运行过程 9.5条件编译 通过条件编译指令,可以控制编译器有选择 地进行编译,满足条件时编译某一组语句,否 则编译另一组语句。 利用条件编译指令,可以控制产生不同的版 本,对于程序调试、移植都是非常有用的。 结构一:#ifdef标识符 程序段1 [#else 程序段2] #endif 几种常用的条件编译结构: 编译条件的真假由标识符是否在此之前用#define 指令定义过来决定。其中#else部分是可选的。 结构二:#ifndef标识符 程序段1 [