- 1、本文档共21页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第8章编译预处理分析
第8章 编译预处理 本章教学目标: 理解include命令的含义,熟练掌握include命令的用法; 掌握#宏定义#define命令的使用; 了解条件编译的各种形式和意义。 第8章 编译预处理 8.1 文件包含#include 命令 8.2 宏定义#define 命令 8.3 条件编译 8.1 文件包含#include 命令 文件包含由#include命令来说明。编译预处理时,系统将包含文件的内容插入到程序中引用它的地方,即程序中相应的#include命令所在处,如下图8-1所示: 文件包含的一般形式为: #include 文件名 和 #include “文件名” 例如,#include“math.h” 特别注意 (1) 每行写一句,只能写一个文件名,结尾不加分号“;”。被包含的文件必须是源文件而不能是目标文件。文件名可以任意,但通常以“h”(head的第一个字母)为后缀,因为被包含文件通常在包含文件的头部,被包含文件也因此而被称为“头文件”。 (2) 文件包含可以嵌套,即在一个被包含的文件中可以包含另一个被包含文件,但要注意避免重复包含和重复定义问题,采用的方法是条件编译。 (3) 当一个文件中有多条include命令将自己编写的文件包含进来时,应注意它们的先后次序。比如,如果文件A包含文件B和文件C,而文件B要用到文件C中的内容,那么,在文件A中应将#include“C”写在 #include“B”的前面。 (4) 在include命令中,文件名可以用尖括号或双引号括起来,二者都是合法的,其区别是用尖括弧时,系统到存放C库函数头文件所在的目录中去寻找要包含的文件。用双引号时,系统先在用户当前目录中寻找要包含的文件,若找不到,再按标准方式查找。 8.2 宏定义#define 命令 使用#define命令指定一个标识符(即名字)来代表一个字符串。宏定义分为不带参数和带参数两种。 8.2.1 不带参数的宏定义 不带参数的宏定义是指用一个指定的标识符(宏名)来代表一个常量(宏体)。其一般格式为: #define 标识符 字符串 其含义是将程序中该命令以后出现标识符的地方均用字符串来替代。其中标识符习惯上用大写字母表示。 【例8.1】不带参数的宏定义的应用。 #define PI 3.1415926 main( ) { float r, circle, area; printf(“\nPlease input radius: “); scanf(“%f”,r); circle = 2 * PI * r; area = PI * r * r; printf(“\ncircle = %f area = %f”, circle, area); } 说 明 在程序中使用宏定义可以提高程序的易读性和通用性,便于程序的修改、调试和移植。 使用中应注意下面几点: (1)习惯上宏名一般用大写字母表示; (2)宏定义不是C语句,书写时行末不应加分号; (3)在进行宏定义时,可以引用已定义的宏名; (4)当宏体是表达式时,为稳妥起见常将它用括弧括起来; (5)若宏名字出现在字符串内,则预处理时它将不被宏替换; (6)若宏名字出现在标识符内,则预处理时它也不被替换; (7)同一个宏名可以重复定义,如果不一致,编译时会发出警告,并以最后一次定义为准。 (8)当宏定义在一行中写不下时,可在行尾用反斜杠“\”进行续行。 (9)宏定义通常放在源程序文件的开头,其作用域是整个源程序。也可以在函数内部作宏定义,这时宏名字的作用域只在本函数。可用#undef终止宏定义的作用域: (10)与变量定义不同,宏定义只作字符替换,不分配内存空间,也不做正确性检查。 (11)宏定义时可以不包含宏体,即写成: #define 宏名 此时仅说明宏名已被定义。 8.2.2 带参数的宏定义 带参数的宏更具灵活性。定义的一般形式为: #define 宏名(参数表) 宏体 例 #define RECT(A, B) A*B 宏替换时,当实参取不同值时,宏将取得不同的值,这是使用带参数宏定义的优点。 对于带参数的宏定义,使用中应注意以下问题: (1)定义带参数的宏时,宏体中一般应含有参数。另外,宏名与圆括弧之间不应留有空格; (2)为了保证宏展开的正确性,通常宏体中的参数以及宏体本身都用圆括弧扩起来; (3)ANSI C提供了两个预处理操作符:#和##。这两个操作符用于宏体中。#操作符使跟在它后面的实参转换为带引号的字符串。##操作符用于连接两个符号。 (4)带参的宏与函数很相似,当两者是有着本质上的区别的。 【例8.2】使用宏得到多个结果。 #def
文档评论(0)