网站大量收购独家精品文档,联系QQ:2885784924

第8章编译和预处理_1207教程.doc

  1. 1、本文档共17页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第8章编译和预处理_1207教程

编译和预处理 学习目标 了解程序的运行机制 了解程序错误类型并会排错 掌握无参数宏定义和带参数宏定义的使用 学会文件包含的使用 熟悉条件编译指令的使用 对C语言来说,除了掌握必要的语法机制外,学好编译与预处理命令也是写出高质量代码的前提。预处理命令的作用不是实现程序的功能,而是给C语言编译系统提供信息,通知C编译器对源程序进行编译之前应该做哪些预处理工作。预处理是指在进行编译之前所作的处理,由预处理程序负责完成。接下来还要经过编译、链接,才能变成可执行程序。 C语言的运行机制 请思考一个问题,用C语言编写的程序是如何被计算机识别运行的呢?你一定会想到:翻译!是的,C语言编写的程序需要用“翻译官”翻译成计算机能识别的0和1符号,这个“翻译官”就是编绎器。C语言从源程序到生成可执行的目标文件的主要过程如下:源代码(预处理(编译(链接(可执行文件 运行结果 接下以图8-1为例,对编译的每一步进行详细分析,具体解释如下: 预处理:对源文件代码中的宏进行替换,并将包含的头文件整体插入源文件中,为做准备。C语言的编译预处理功能主要包括宏定义、文件包含和条件编译3种。 编译:编绎器读取预处理后的输出文件进行词法和语法分析,将高级语言指令转换为功能等效的汇编代码。 链接:编译得到的零散的二进制代码文件组合成二进制可执行文件主要完成两工作一是解析其他文件中函数引用或其他引用,二是解析库函数。 错误分类 当读者兴致勃勃地写完代码,开始编译程序,这时出现一大堆的错误提示,不要沮丧,再优秀的程序员也会犯错。有人说过,程序编写的过程中大部分的时间都是用在错误调试上。有时为了排除一个小问题,可能会几天几夜地跟踪代码,正因为如此,有人把找到并解决问题的那一刻称为“痛苦的幸福”。在继续说明程序错误前,有个观点要声明:没有完美的程序,不存在没有缺陷的程序。如果一个程序运行很完美,那是因为它的缺陷到现在还没有被发现。同样,软件测试是为了发现程序中可能存在的问题,而不是证明程序没有错误。 程序错误通常可分为两大类,接下来针对这两类错误进行详细地讲解。 1、语法错误 程序书写形式在某些方面不符合C语言的要求,称为语法错误,这种错误是在编译阶段检查出来的。编译器在编译阶段主要进行语法、词法分析,产生目标代码并进行代码优化等处理,为全局变量和静态变量等分配内存,检查函数是否已定义,如果没有定义,是否有函数声明空,函数声明通知编译器:该函数将在本文件中晚些时候定义,或者是在其他文件中定义等。语法错误是比较容易修改的错误。 排除错误,简称排错,有两层含义:一是找到出错的代码,二是修改该代码。 排错也有两种形式:一是静态排错,编译器和链接器发现的错误基本都属于这一类,通过观察源程序便能确定问题所在并改正它;二是动态排错,逻辑错误的发现和纠正都比较困难,要综合考虑代码、使用的数据和输出结果的关联,仔细思考,尝试更换数据,观察结果的改变,依此分析错误可能存在的地方。 如果还是不行,就要使用动态检查机制,最基本的方法是“分而治之”,检查程序执行的中间状态,最常用的方法是在可能出错的地方插入一些输出语句,让程序输出一些中间变量的值,确定可能出错的区域。此外,还可利用编译环境提供的DEBUG工具,对程序进行跟踪、监视和设断点等,定位并排错。 宏定义是最常用的预处理功能之一,它用于将一个标识符定义为一个字符串,这样,在源程序被编译器处理之前,预处理器会将标识符替换成所定义的字符串。根据是否带参数,可以将宏定义分为无参数宏定义和带参数宏定义。本节将针对这两种形式的宏定义进行详细地讲解。 不带参数的宏定义 在程序中,经常会定义一些常量,例如,3.14、“ABC”。如果这些常量在程序中被频繁使用,难免会出现书写错误的情况。为了避免程序书写错误,可以使用不带参数的宏定义来表示这些常量,其语法格式如下所示: #define 标识符 字符串 在上述语法格式中,“#define”用于标识一个宏定义, 下面看一个具体的,示例代码如下: #define PI 3.14 在上述宏定义的作用就是PI来代表值141592。如此一来,凡是在随后源代码中出现PI的地方为141592。接下来通过一个案例来验证,如例8-1所示。 #include stdio.h #define PI 3.141592 void main() { printf(%f\n, PI); } 上面的程序预处理时,删除#define语句、展开所有的宏定义后,代码如下所示: #include stdio.h void main() { printf(%f\n, 3.141592); } 运行结果如 运行结果 在例8-1中,首先定义了一个,.141592,然后在main()函数内,使用printf()语句输出了PI的值。14

文档评论(0)

dajuhyy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档