第15讲 编译预处理

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
不带参数的宏定义 带参数的宏定义
2007年10月 张华 武汉大学
6
编译预处理
宏定义
无参数的宏定义
格式: 格式:
#define 宏名 字符串
举例: 举例:
#define PI 3.14
说明: 说明:
宏定义一般写在程序的开头。 宏定义一般写在程序的开头。 宏名的命名规则同变量名,一般习惯用大写字母,以便与变量区别, 宏名的命名规则同变量名,一般习惯用大写字母,以便与变量区别, 但也允许用小写字母。宏名的前后应有空格,以便准确地辨认宏名。 但也允许用小写字母。宏名的前后应有空格,以便准确地辨认宏名。 宏定义必须写在函数之外, 宏定义必须写在函数之外,宏名的有效范围是从宏定义开始到本源 程序文件结束,或遇到预处理命令#undef时止。 时止。 程序文件结束,或遇到预处理命令 时止
#include <filename>
– 只在指定存放头文件的目录下(IDE的include子目录下)查找该文件。 只在指定存放头文件的目录下( 子目录下) 的 子目录下 查找该文件。
#include “filename“
– 首先在当前文件(该命令所在的文件)所在目录下查找该文件; 首先在当前文件(该命令所在的文件)所在目录下查找该文件; – 若未找到,再到指定存放头文件的目录下去查找。 若未找到,再到指定存放头文件的目录下去查找。
好处: 好处:
当许多程序中需要用到一些共同的常量、数据等资料时, 当许多程序中需要用到一些共同的常量、数据等资料时,可以把这 些共同的东西写在以.h作为扩展名的头文件中 作为扩展名的头文件中; 些共同的东西写在以 作为扩展名的头文件中; 如果哪个程序需要用时,就可用文件包含命令把它们包含进来, 如果哪个程序需要用时,就可用文件包含命令把它们包含进来,省 去了重复定义的麻烦。 去了重复定义的麻烦。
第十五讲 编译预处理
张 华
C语言程序设计
第十五讲 编译预处理
编译预处理 文件包含 宏定义
无参 有参
条件编译 程序设计举例
2007年10月 张华 武汉大学
2
编译预处理
简介
预处理(preprocessing) )
在实施代码转换之前进行。 在实施代码转换之前进行。 包括: 包括:
包含其它文件 定义宏 有条件的编译程序代码
2007年10月 张华 武汉大学
7
编译预处理
宏定义
无参数的宏定义
说明: 说明:
宏定义不但可以定义常量,还可以定义 语句和表达式等 语句和表达式等。 宏定义不但可以定义常量,还可以定义C语句和表达式等。 宏定义允许嵌套。 宏定义允许嵌套。 宏代换只是指定字符串替换宏名的简单替换,不做任何语法检查。 宏代换只是指定字符串替换宏名的简单替换,不做任何语法检查。 如有错误,只能在编译已被宏展开后的源程序时发现。 如有错误,只能在编译已被宏展开后的源程序时发现。 宏定义是专门用于预处理命令的一个专用名词,只作字符替换, 宏定义是专门用于预处理命令的一个专用名词,只作字符替换,不 分配内存空间。 分配内存空间。 当宏定义在一行中写不下,需要在下一行继续时, 当宏定义在一行中写不下,需要在下一行继续时,只需在最后一个 字符后紧接着加一个反斜杠“ 。 字符后紧接着加一个反斜杠“\”。 可用宏定义表示数据类型,使书写方便。 可用宏定义表示数据类型,使书写方便。
预处理命令(preprocessor
directive)的以占多行) 开头的一行 可以占多行) #前面只能出现空白符 前面只能出现空白符
2007年10月 张华 武汉大学
3
编译预处理
文件包含
#include
把所包含的文件的内容放到指令所在的地方。 把所包含的文件的内容放到指令所在的地方。 两种形式: 两种形式:
2007年10月 张华 武汉大学
11
2007年10月 张华 武汉大学
5
编译预处理
宏定义
#define
用一个标识符来表示一个字符串,称为“ 用一个标识符来表示一个字符串,称为“宏”。 被定义为“ 的标识符称为“宏名” 被定义为“宏”的标识符称为“宏名”。 在编译预处理时,对程序中所有出现的“宏名” 在编译预处理时,对程序中所有出现的“宏名”,都用宏 定义中的字符串去代换,这称为“宏代换” 宏展开” 定义中的字符串去代换,这称为“宏代换”或“宏展开”。 包括: 包括:
指令: 指令:
#if #ifdef #ifndef #else #endif
2007年10月 张华 武汉大学
10
编译预处理
小结
编译预处理功能是C语言特有的功能, 编译预处理功能是C语言特有的功能,它是在对源程 序正式编译前由预处理程序完成的。 序正式编译前由预处理程序完成的。程序员在程序中 用预处理命令来调用这些功能。预处理命令若有变动, 用预处理命令来调用这些功能。预处理命令若有变动, 必须对源程序重新编译和连接。 必须对源程序重新编译和连接。 使用预处理功能便于程序修改、阅读、移植和调试, 使用预处理功能便于程序修改、阅读、移植和调试, 便于实现模块化程序设计。 便于实现模块化程序设计。
2007年10月 张华 武汉大学
4
编译预处理
文件包含
#include
使用说明: 使用说明:
一个#include命令只能指定一个被包含文件,若有多个文件要包含, 命令只能指定一个被包含文件,若有多个文件要包含, 一个 命令只能指定一个被包含文件 则需要用多个#include命令。 命令。 则需要用多个 命令 文件包含允许嵌套,即在一个被包含文件中又可以包含另一个文件。 文件包含允许嵌套,即在一个被包含文件中又可以包含另一个文件。 文件包含命令通常包含的文件是头文件,即后缀是.h的文件,也可 文件包含命令通常包含的文件是头文件,即后缀是 的文件, 的文件 以包含其他的源文件,例如,可包含.c文件。 以包含其他的源文件,例如,可包含 文件。 文件 使用文件包含命令可使多个源文件合并成一个源程序后进行编译。 使用文件包含命令可使多个源文件合并成一个源程序后进行编译。
2007年10月 张华 武汉大学
8
编译预处理
宏定义
有参数的宏定义
格式: 格式:
#define 宏名 形参表 字符串 宏名(形参表 形参表)
举例: 举例:
#define M(a,b) a*b
说明: 说明:
实参个数与形参个数相同,但没有类型要求。 实参个数与形参个数相同,但没有类型要求。 宏名和形参表之间不能有空格出现。 宏名和形参表之间不能有空格出现。 如宏定义包含“ 去掉, 如宏定义包含“##”,则宏替换时将“##”去掉,并将其前后字符 ,则宏替换时将“ 去掉 串合在一起。 串合在一起。
2007年10月 张华 武汉大学
9
编译预处理
条件编译
条件编译
目的和作用
条件编译是指对源程序中某段程序通过条件来控制是否参加编译。 条件编译是指对源程序中某段程序通过条件来控制是否参加编译。 根据条件来选取需要的代码进行编译,以便生成不同的应用程序, 根据条件来选取需要的代码进行编译,以便生成不同的应用程序, 供不同用户使用。 供不同用户使用。 此外,条件编译还可以方便程序的逐段调试,简化程序调试工作。 此外,条件编译还可以方便程序的逐段调试,简化程序调试工作。
相关文档
最新文档