c语言教学资料:08_预处理命令_第1页
c语言教学资料:08_预处理命令_第2页
c语言教学资料:08_预处理命令_第3页
全文预览已结束

下载本文档

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

文档简介

1、本章主要内容:宏定义文件包含条件编译1.1编译预处理编译预处理是在对源程序正式编译之前的处理,以“#”开头,如文件包含“#include”、 宏定义“#define”等。预处理命令不是c语言本身的组成部分,不能直接対它进行编译。 所有的预处理指令都是在编译之前完成的,不占用程序运行时间。c语言提供了 3中预处理功能,即宏定义、文件包含、条件编译。以“#”开头,占用 一个单独的书写行,语句结尾不适用分号。宏定义: #define文件包含:#include条件编译:# ifndef. .#if. .#else. .#end 讦等1.2宏定义1.2.1不带参数的宏定义语法格式:#define宏名宏体

2、(宏体可省略,如果没有则作为一个标识用于#if语句中) 功能:用指定标识符(宏名)代替字符序列(宏体)说明:宏名要是一个合法的标识符,通常采用大写字母表示;宏体可以是常数、表达式和语 句,甚至可以是多条语句。举例:#define pi 3.1415926/定义兀的值为3.1415926,以后要用到兀,就可以直接用pi#define out printfc4hello world!n,?); 定义宏 out 替换后面的函数用#undef可以终止宏名作用域,格式为:#undef宏名 举例:void main()#define yes 1定义宏 yespi'intf(“dn”,yes);#u

3、ndefyes结束宏yes的作用域#define yes 0重新定义宏yesprintf(n%dnm,yes);有关宏定义的使用,需注意以下几点:1宏名习惯采用大写,以便与普通变量区分;2 宏定义不是c语句,所以不能在行尾加分号;否则,宏展开时,会将分号也算在内3 在宏展开时,预处理程序仅按宏定义简单替换宏名,不做任何检查。如果有错误,只能 由编译器在编译宏展开后的源程序时发现。4 宏定义的位置是任意的,宏名的有效范围是从定义命令处到本模块结束。通常写在文件 开头处。5 宏调用时,是原样替换,不进行任何转换。1.2.2带参数的宏定义语法格式:#define宏名(参数列表)符号串序列说明:宏定义

4、的参数称为形参,只有参数名,没有数据类型,宏调用中的参数为实参。为了 避免出错,在定义带参数的宏时,符号串序列内的形参通常要用括号括起来。举例:带参数宏定义#define add(x, y) (x) + (y)宏调用:total = add(6, 4*7);替换规则:在编译预处理时,程序中凡是宏调用的地方一律按#define命令中的符号串序列 从左到右进行替换(原样),再将宏调用的实参依次替换形参。对于符号串序列屮不是参数 字符的(如丫、)、,+'等),则保留不变。(参见代码example 1)带参数的宏与函数的区别: 函数调用先求实参表达式的值,再代入形参;带参数的宏只是进行简单的字

5、符替换,宏 展开的时候并不对实参表达式求值。 函数调用是在程序运行时处理的,为形参分配临时的内存单元。而宏则是在编译前进行 的,不分配内存空间。 函数的参数需要数据类型,而宏不用。 宏替换不占运行时间,只占编译时间,而函数调用则占运行时间(分配单元、保留现场、 值传递、返回)。 一般用宏来代表简单的表达式比较合适,复杂的还是采用函数特殊的宏定义符号:#是转字符串符号,展开吋自动把形参当字符串使用。(参见代码example2)#是前后连接符号,展开时直接将左边和右边的符号连在一起。是续行符,定义时可以多行,但是后面不能有任何字符,包括空格。(参见代码example3)#define常量定义与ty

6、pede数据类型定义的异同点:#define p_int int*/在编译前执行(原样替换)typedef int* p_int在编译时执行相同点:都是定义了一个int指针类型的別名不同点:用#define 时,p_int a, b;相当于 int* a, b;即 int*a; int b;此时 b 不是 int*,而是 int用 typedef 时,p_int a, b;相当于 int *a; int *b;13文件包含文件包含指一个源文件可以将另外一个源文件全部内容包含进來。常用于引用其他模块 定义的变量类型、函数、宏定义等。这一过程通过预处理命令include 完成。文件包含预 处理语句

7、的一般形式有两种:include文件名:用时,系统到存放c库函数头文件所在的目录(即c编译系统的include子目录)中寻找要包含的文件(这称为标准方式,一般是系统文件)#include “文件名”:用円时,系统先在用户创建工程所在的目录中寻找要包含的文件,若找不到,再按标准方式查找(即再按方式查找,一般是用户自定义的文件) 处理过程:预编译时,用被包含文件的内容取代该预处理命令。如图所示:#include b语句块a语句块b语句块a语句块hlel.cfile2.c预编译后 filel.c一个程序常常rfl许多文件组成,为了方便管理,常常将函数定义在.c文件中,而将函数 的声明语句放在与.c文

8、件同名的头文件(.h文件)中,这样就可以通过编译预处理“#include vxxx.hh或“#include “xxx.h”实现函数的声明,这种方法在大型程序文件的组织中十分有用。(参见代码example4)1.4条件编译通常情况下,源程序的所有语句都参加编译,但有时候也希望只对其中满足条件的语句 进行编译,此时就要用到条件编译。条件编译是指编译器在开始编译前,根据条件编译指令, 保留复合条件的程序块,而舍弃不符合条件的程序块。条件编译的一般形式如下:#ifdef 标识符程序块1#else程序块2#endif功能:如果标识符己经被#define命令定义过,则在程序编译时只对程序块1进行编译,否 则,只对程序块2进行编译。(参见代码example5)如果将#ifdef换成#ifndef,则刚好相反,如果标识符没被#define命令定义

温馨提示

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

评论

0/150

提交评论