欢迎来到天天文库
浏览记录
ID:21618573
大小:69.52 KB
页数:24页
时间:2018-10-19
《c++程序生成过程》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、C++程序生成过程高嵩程序生成的三个步骤编译预处理#include文件引入,宏展开,预编译指令处理,模板展开分别编译每个编译单位(经过预处理的文件)独立的进行编译链接保证每个编译单位中符号意义的一致编译预处理纯文本操作,从源文件到编译单元……头文件编译器不区分头文件与普通程序文件,只是提供了#include预编译指令头文件通过#include预编译指令引入#include”headFile.h”使用头文件的全文替换#include所在行STL头文件使用#include的形式,xxxx是否是一个文件由实现定义头文件保
2、护经典的#ifndef#pragmaonce(实现定义,vc/gcc/icc均支持)宏与模板#define简单的替换,尽量避免使用模板也是宏的一种,在预处理阶段展开使用宏与模板时,宏与模板的全部信息必须位于当前文件中(单次扫描编译)编译单次扫描编译器……从编译单元生成目标码文件……单次扫描编译编译器每次只处理一个文件,每个文件只处理一次。编译一个文件时不能获得其他文件的信息若需要使用其他编译单元【定义】的符号,必须在本编译单元中【声明】定义与声明一般来说,实际分配空间的就是定义,否则就是声明类?模板?头文件的注意事项可以有一般
3、只包含各类声明类与模板可以在头文件中定义单一定义规则(One-DefinitionRule,ODR)可以包含const常量/inline函数的定义不能有绝不能有数据或函数的定义不应包含using操作不应包含#define……编译工作为当前编译单元中定义的数据分配地址空间将当前编译单元中的函数转为机器码,外部符号的地址会暂时空出来等待链接时处理产生三个表与链接相关的三个表未解决符号表(unresolvedsymboltable)导出符号表(exportsymboltable)地址重定向表(addressredirecttable
4、)链接将各个编译单元目标代码组织起来……链接原理在所有编译单元中,每个符号必须恰好只【定义】一次(ODR标准的类与模板定义除外),可以【声明】多次。链接即确定不同编译单元中符号的引用关系,确定具体地址,并计算偏移量外部链接与内部链接一个符号若可以在其他编译单元中使用,称为具有【外部链接】,否则称为【内部链接】const数据/inline函数具有内部链接(具体参考标准与具体实现)外部链接实际就是将符号加入导出符号表可以使用extern强制const数据外部链接链接步骤确定各个目标文件在最终可执行文件里的位置对目标文件中记录的符号
5、地址进行重定向查找导出符号表,在未解决符号表记录的所有位置上填写实际地址将所有目标文件写到最终可执行文件的各个位置上常见错误无法解析的外部符号(unresolvedexternallink)符号重定义(duplicatedexternalsymbols)非法的例子//file1.cppinta;intb=1;externintc;//file2.cppinta;externdoubleb;externintc;问题为什么前面讲头文件中一般只包含声明而不包含定义?Makefile自动化的程序生成……Makefile是什么自动化的
6、完成一个指定的目标多用于程序的自动生成自动根据依赖关系顺序执行命令可以自动根据时间判断是否需要重新执行某步骤Makefile的基本结构标签:标签1标签2命令1命令2一个简单的Makefileedit : main.o kbd.o command.o display.o insert.o search.o files.o utils.o cc -o edit main.o kbd.o command.o display.o insert.o search.o files.o utils.o ma
7、in.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 : inser
8、t.c defs.h buffer.h cc -c insert.c search.o : search.c defs.h buffer.h cc -c search.c files.o : files.c de
此文档下载收益归作者所有