第8章编译和预处理_1207分析.doc

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

编译和预处理 学习目标 了解程序的运行机制 了解程序错误类型并会排错 掌握无参数宏定义和带参数宏定义的使用 学会文件包含的使用 熟悉条件编译指令的使用 对C语言来说,除了掌握必要的语法机制外,学好编译与预处理命令也是写出高质量代码的前提。预处理命令的作用不是实现程序的功能,而是给C语言编译系统提供信息,通知C编译器对源程序进行编译之前应该做哪些预处理工作。预处理是指在进行编译之前所作的处理,由预处理程序负责完成。接下来还要经过编译、链接,才能变成可执行程序。 C语言的运行机制 请思考一个问题,用C语言编写的程序是如何被计算机识别运行的呢?你一定会想到:翻译!是的,C语言编写的程序需要用“翻译官”翻译成计算机能识别的0和1符号,这个“翻译官”就是编绎器。C语言从源程序到生成可执行的目标文件的主要过程如下:源代码(预处理(编译(链接(可执行文件,具体的流程如图8-1所示。 运行结果 接下以图8-1为例,对编译的每一步进行详细分析,具体解释如下: 预处理:对源文件代码中的宏进行替换,并将包含的头文件整体插入源文件中,为接下来的操作做准备。C语言的编译预处理功能主要包括宏定义、文件包含和条件编译这3种。 编译:编绎器读取预处理后的输出文件,对其进行词法和语法分析,将高级语言指令转换为功能等效的汇编代码。 链接:将编译后得到的零散的二进制代码文件组合成二进制可执行文件。该步骤主要完成两个工作:一是解析其他文件中函数引用或其他引用,二是解析库函数。 理解程序的运行过程,有助于我们在编程时定位错误。接下来我们将学习预处理的知识和错误分析。 程序错误分析 错误分类 当读者兴致勃勃地写完代码,开始编译程序,这时出现一大堆的错误提示,不要沮丧,再优秀的程序员也会犯错。有人说过,程序编写的过程中大部分的时间都是用在错误调试上。有时为了排除一个小问题,可能会几天几夜地跟踪代码,正因为如此,有人把找到并解决问题的那一刻称为“痛苦的幸福”。在继续说明程序错误前,有个观点要声明:没有完美的程序,不存在没有缺陷的程序。如果一个程序运行很完美,那是因为它的缺陷到现在还没有被发现。同样,软件测试是为了发现程序中可能存在的问题,而不是证明程序没有错误。 程序错误通常可分为两大类,接下来针对这两类错误进行详细地讲解。 1、语法错误 程序书写形式在某些方面不符合C语言的要求,称为语法错误,这种错误是在编译阶段检查出来的。编译器在编译阶段主要进行语法、词法分析,产生目标代码并进行代码优化等处理,为全局变量和静态变量等分配内存,检查函数是否已定义,如果没有定义,是否有函数声明空,函数声明通知编译器:该函数将在本文件中晚些时候定义,或者是在其他文件中定义等。语法错误是比较容易修改的错误。 语法错误又可分为编译错误和链接错误。 (1)编译错误: 如果文件中出现编译错误,编译器将给出错误信息,并指明错误所在的行号,提示用户修改代码。编译错误主要有两种: ①语法问题:该错误出现的原因肯可能是缺少符号,如缺少分号、括号等,符号拼写不正确。一般来说,编译器都会指明错误所在行号,但由于代码是彼此联系的,有时编译器给出的信息未必正确,源程序中出错位置要么就是编译器提示位置,要么在提示位置之前,甚至是在前面很远的地方。另一个问题是,有时一个错误会让编译器给出很多出错提示,所以,面对成百上千个错误提示时,不要害怕,没准修改一处代码,所有的问题都解决了。 ②上下文关系有误:程序设计中有很多彼此关联的东西,例如变量要先创建再使用,有时编译器会发现某个变量尚未定义,便会提示出错。这种情况有时是因为变量名拼写有误,有时是因为确实忘了定义。 除了错误外,编译器还会对程序中一些不合理的用法进行警告(warning)。尽管警告不耽误程序的编译链接,但对警告信息不能掉以轻心,警告常常预示着隐藏很深的错误,特别是逻辑错误,应当仔细排查。 (2)链接错误: 当一个编译单元中调用了库函数或定义在其他编译单元中的函数时,在链接阶段就需要从库文件或其他目标文件中抽取该函数的二进制代码,以便进行组合等一系列工作。找不到函数定义时,链接器无法找到该函数对应的代码,便会提示出错,指出名字未解析。一般来说,链接器给出的错误提示信息是关乎函数的链接。 2、逻辑错误 程序书写本身没错,编译链接能够完成,但输出结果与预期不符,或着执行到一半程序就崩溃了,这种错误称为逻辑错误。 即使程序顺利通过了编译链接,也不是说万事大吉,可以收工了,还要检查生成的可执行程序,看其是否实现了所需的功能。实际上,运行阶段出现的逻辑错误更难排查,更让人头疼,编译错误和链接错误好歹有提示信息,但面对逻辑错误,就像浑水摸鱼。 可能出现的逻辑错误有以下情况: (1)与操作系统有关的操作,例如是否进行了非法操作,如非法内存访问等; (2)是否出现了死循环

文档评论(0)

此项为空 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档