C++程序生成过程.pptx

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

C++程序生成过程1

程序生成的三个步骤编译预处理#include文件引入,宏展开,预编译指令处理,模板展开分别编译每个编译单位(经过预处理的文件)独立的进行编译链接保证每个编译单位中符号意义的一致2

编译预处理纯文本操作,从源文件到编译单元……3

头文件编译器不区分头文件与普通程序文件,只是提供了#include预编译指令头文件通过#include预编译指令引入#include”headFile.h”使用头文件的全文替换#include所在行STL头文件使用#includexxxx的形式,xxxx是否是一个文件由实现定义头文件保护经典的#ifndef#pragmaonce(实现定义,vc/gcc/icc均支持)4

宏与模板#define简单的替换,尽量避免使用模板也是宏的一种,在预处理阶段展开使用宏与模板时,宏与模板的全部信息必须位于当前文件中(单次扫描编译)5

编译单次扫描编译器……从编译单元生成目标码文件……6

单次扫描编译编译器每次只处理一个文件,每个文件只处理一次。编译一个文件时不能获得其他文件的信息若需要使用其他编译单元【定义】的符号,必须在本编译单元中【声明】7

定义与声明一般来说,实际分配空间的就是定义,否则就是声明类?模板?8

头文件的注意事项可以有一般只包含各类声明类与模板可以在头文件中定义单一定义规则(One-DefinitionRule,ODR)可以包含const常量/inline函数的定义不能有绝不能有数据或函数的定义不应包含using操作不应包含#define……9

编译工作为当前编译单元中定义的数据分配地址空间将当前编译单元中的函数转为机器码,外部符号的地址会暂时空出来等待链接时处理产生三个表10

与链接相关的三个表未解决符号表(unresolvedsymboltable)导出符号表(exportsymboltable)地址重定向表(addressredirecttable)11

链接将各个编译单元目标代码组织起来……12

链接原理在所有编译单元中,每个符号必须恰好只【定义】一次(ODR标准的类与模板定义除外),可以【声明】多次。链接即确定不同编译单元中符号的引用关系,确定具体地址,并计算偏移量13

外部链接与内部链接一个符号若可以在其他编译单元中使用,称为具有【外部链接】,否则称为【内部链接】const数据/inline函数具有内部链接(具体参考标准与具体实现)外部链接实际就是将符号加入导出符号表可以使用extern强制const数据外部链接14

链接步骤确定各个目标文件在最终可执行文件里的位置对目标文件中记录的符号地址进行重定向查找导出符号表,在未解决符号表记录的所有位置上填写实际地址将所有目标文件写到最终可执行文件的各个位置上15

常见错误无法解析的外部符号(unresolvedexternallink)符号重定义(duplicatedexternalsymbols)16

非法的例子//inta;intb=1;externintc;//file2.cppinta;externdoubleb;externintc;17

问题为什么前面讲头文件中一般只包含声明而不包含定义?18

Makefile自动化的程序生成……19

Makefile是什么自动化的完成一个指定的目标多用于程序的自动生成自动根据依赖关系顺序执行命令可以自动根据时间判断是否需要重新执行某步骤20

Makefile的基本结构标签:标签1标签2 命令1 命令221

一个简单的Makefile

????edit?:?main.o?kbd.o?command.o?display.o?insert.o?search.o??utils.o

????????????cc?-o?edit?main.o?kbd.o?command.o?display.o?insert.o?search.o??utils.o

????main.o?:?main.c?defs.h

????????????cc?-c?main.c

????kbd.o?:?kbd.c?defs.h?command.h

????????????cc?-c?kbd.c

????command.o?:?command.c?defs.h?command.h

????????????cc?-c?command.c

????display.o?:?display.c?defs.h?buffer.h

????????????cc?-c?display.c

????insert.o?:?insert.c?defs.h?buffer.h

????????????cc?-c?insert.c

????search.o

文档评论(0)

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

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

1亿VIP精品文档

相关文档