- 1、本文档共29页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
程序编译
第20章 程序编译 编写的一个个cpp文件和h文件是如何组织成二进制可执行文件的,这是本章要讨论的内容。除了使用变量定义、函数定义与调用、类定义与类实现外,C++还提供了诸如“#inlcude”等预处理机制,用以辅助代码的编写,同时,本章将针对程序的编译和调试进行学习。 20.1 程序的编译流程 第1章中介绍了使用VC6开发环境编译运行C++程序的基本步骤,提及“选择“Build”菜单中的“Build 工程名”命令,或直接按F7键即可实现对整个工程所有源代码文件的编译和链接。编译链接无误即可生成一个后缀为exe的可执行文件”。这所有的工作都是由VC6开发环境完成的,对一个程序员来说,了解其内部运作细节有助于对程序编写有个全局性的把握,程序的编译流程大体可分为编辑、预处理、编译、链接4个步骤: 20.1.1 编辑 源文件是通过键盘输入计算机,存储在硬盘上的程序文件,在DOS和Windows环境下其后缀名为.cpp(定义文件)或.h(头文件),一个程序可能包含很多源文件。将源文件输入计算机并修改、保存的过就称为“编辑”。 20.1.2 预处理和编译 编译用于将每个编译单元翻译成二进制代码文件,在DOS和Windows环境下,二进制代码文件的后缀名为.obj,在Unix环境下,其后缀名为.o。 首先来看下什么是编译单元,在很多C++教材中有这样的论述“头文件不参加编译,只有实现文件(cpp)文件才参加编译”,这种简单的表述是不科学的,容易给读者留下错误的印象,事实上,编译器处理的对象是由单个cpp文件和其中递归包含的头文件组成的编译单元。 当一个cpp文件在编译时,预处理器首先递归包含头文件,形成一个含有所有必要信息的单个源文件,这个源文件就是一个编译单元。这个编译单元会被编译成为一个与cpp 文件名同名的目标文件(.o或是.obj) 。 20.1.3 链接 链接程序的作用是将编译得到的零散的二进制代码文件组合成二进制可执行文件,有两个意义: (1)对应于某个编译单元的对象文件包含在其他编译单元中定义的函数引用或其他指定项的引用,而这些函数或项仍没有被解析。 (2)建立与库函数的链接 出于商业考虑或保密需要,C++标准库函数和其他第3方库函数是以二进制代码形式提供的,库文件的后缀名为.lib,如果在编译单元中声明并调用了库函数,便需要对库函数进行解析,链接器会从对应的库文件中将该函数的二进制代码抽出插入到调用处,当然,如果库中无此函数或找不到对应的库,也会发生unresolved(未解析)的错误。 20.2 预处理 前面接触到的“#include”和“#define”都属于编译预处理,C++允许在程序中用预处理指令写一些命令行,均以“#”打头,为和普通的语句区分,预处理行尾不加分号,原则上,预处理行可以写在程序的任何位置,但推荐(或是惯常写法)写在程序文件的头部。编译器在对文件进行实质性的编译之前,先处理这些预处理行,这也是“预”字的含义。 预处理器在编译器之前根据指令更改程序文本。编译器看到的是预处理器修改过的代码文本 常用的预处理指令有: 头文件包含 宏 条件编译 其他,如#pragma等 20.2.1 头文件包含 头文件包含有两种格式: #include 头文件名 #include “头文件名” 两者的区别在于预处理器查找头文件的顺序,尖括号形式是用于系统提供的头文件,而引号方式首先在当前目录下查找,因而适用于自定义的头文件。 预处理器会用包含的头文件插入到源文件中,因为包含嵌套的关系(举例来说,在某个A.cpp文件中使用了头文件包含#include “B.h”,而B.h文件中使用“#include “C.h”,相当于B.h和C.h都会被插入A.cpp文件中,用以替换两个#include指令),可能有多个头文件插入到源文件中。 20.2.2 宏 宏定义即是用一个宏名来命名一个字符串,形式如下: #define 宏名 字符串 宏名使合法的C++标识符,定义的宏名可以应用在程序中,预编译器将编译单元中出现的宏都使用字符串来替换,不做任何形式的检查。 (1)对象宏 不带参数的宏被称为对象宏(objectlike macro),#define经常用来定义常量, 此时的宏名称一般为大写的字符串,如: #define NUM 20 (2)函数宏 带参数的宏也被称为函数宏,利用宏可以提高代码的运行效率,函数的调用需要压栈出栈,这一过程如果过于频繁会耗费掉大量的CPU运算资源,所以一些代码量小但运行频繁的代码如果采用带参数宏来实现会提高代码的运行效率,如: #define cube(x) ((x)*(x)*(x)) 20.2.3 条件编译 #if,#else, #endif用于条件编译,其基本形式为: #if 判断表达式
您可能关注的文档
- 知团史 明团情.ppt
- 知己KY3H 五脏相音.ppt
- 知觉与错觉.ppt
- 短文两篇上课用华西3班.ppt
- 石从锐.ppt
- 石义娥.ppt
- 石地裡的收成 了解投资.ppt
- 知识管理系统 V1.0.PPT
- 石榴笑了 演示文稿.ppt
- 眼和耳眼.ppt
- 甘肃省临潭县整理《一级注册建筑师之建筑物理与建筑设备》考试必背100题真题【模拟题】.docx
- Word文档格式设置强化训练试题附答案.doc
- 甘肃省临潭县内部使用《质量员之设备安装质量基础知识》资格考试必刷100题王牌题库带答案(培优B卷).docx
- 甘肃省临潭县《执业药师之西药学综合知识与技能》资格考试必刷200题真题及答案().docx
- 甘肃省临潭县2024年《一级注册建筑师之建筑物理与建筑设备》资格考试必刷100题附参考答案(综合题).docx
- 甘肃省临潭县整理《一级注册建筑师之建筑物理与建筑设备》资格考试必背100题题库附参考答案(综合题).docx
- 冀教版四年级上册数学第七单元 垂线和平行线 测试卷(考点精练).docx
- 冀教版四年级上册数学第七单元 垂线和平行线 测试卷(精练).docx
- 冀教版四年级上册数学第七单元 垂线和平行线 测试卷(精练).docx
- (2025)耐碳青霉烯类耐药菌预防与控制试题及参考答案.pdf
文档评论(0)