C程序生成过程.pptx
《C程序生成过程.pptx》由会员分享,可在线阅读,更多相关《C程序生成过程.pptx(24页珍藏版)》请在冰豆网上搜索。
![C程序生成过程.pptx](https://file1.bdocx.com/fileroot1/2022-10/7/bb921e26-5303-41a9-a7e6-7cd4f610a8ed/bb921e26-5303-41a9-a7e6-7cd4f610a8ed1.gif)
C+程序生成过程,高嵩,程序生成的三个步骤,编译预处理#include文件引入,宏展开,预编译指令处理,模板展开分别编译每个编译单位(经过预处理的文件)独立的进行编译链接保证每个编译单位中符号意义的一致,编译预处理,纯文本操作,从源文件到编译单元,头文件,编译器不区分头文件与普通程序文件,只是提供了#include预编译指令头文件通过#include预编译指令引入#include”headFile.h”使用头文件的全文替换#include所在行STL头文件使用#include的形式,xxxx是否是一个文件由实现定义头文件保护经典的#ifndef#pragmaonce(实现定义,vc/gcc/icc均支持),宏与模板,#define简单的替换,尽量避免使用模板也是宏的一种,在预处理阶段展开使用宏与模板时,宏与模板的全部信息必须位于当前文件中(单次扫描编译),编译,单次扫描编译器从编译单元生成目标码文件,单次扫描编译,编译器每次只处理一个文件,每个文件只处理一次。
编译一个文件时不能获得其他文件的信息若需要使用其他编译单元【定义】的符号,必须在本编译单元中【声明】,定义与声明,一般来说,实际分配空间的就是定义,否则就是声明类?
模板?
头文件的注意事项,可以有一般只包含各类声明类与模板可以在头文件中定义单一定义规则(One-DefinitionRule,ODR)可以包含const常量/inline函数的定义不能有绝不能有数据或函数的定义不应包含using操作不应包含#define,编译工作,为当前编译单元中定义的数据分配地址空间将当前编译单元中的函数转为机器码,外部符号的地址会暂时空出来等待链接时处理产生三个表,与链接相关的三个表,未解决符号表(unresolvedsymboltable)导出符号表(exportsymboltable)地址重定向表(addressredirecttable),链接,将各个编译单元目标代码组织起来,链接原理,在所有编译单元中,每个符号必须恰好只【定义】一次(ODR标准的类与模板定义除外),可以【声明】多次。
链接即确定不同编译单元中符号的引用关系,确定具体地址,并计算偏移量,外部链接与内部链接,一个符号若可以在其他编译单元中使用,称为具有【外部链接】,否则称为【内部链接】const数据/inline函数具有内部链接(具体参考标准与具体实现)外部链接实际就是将符号加入导出符号表可以使用extern强制const数据外部链接,链接步骤,确定各个目标文件在最终可执行文件里的位置对目标文件中记录的符号地址进行重定向查找导出符号表,在未解决符号表记录的所有位置上填写实际地址将所有目标文件写到最终可执行文件的各个位置上,常见错误,无法解析的外部符号(unresolvedexternallink)符号重定义(duplicatedexternalsymbols),非法的例子,/file1.cppinta;intb=1;externintc;/file2.cppinta;externdoubleb;externintc;,问题,为什么前面讲头文件中一般只包含声明而不包含定义?
Makefile,自动化的程序生成,Makefile是什么,自动化的完成一个指定的目标多用于程序的自动生成自动根据依赖关系顺序执行命令可以自动根据时间判断是否需要重新执行某步骤,Makefile的基本结构,标签:
标签1标签2命令1命令2,一个简单的Makefile,edit:
main.okbd.ocommand.odisplay.oinsert.osearch.ofiles.outils.occ-oeditmain.okbd.ocommand.odisplay.oinsert.osearch.ofiles.outils.omain.o:
main.cdefs.hcc-cmain.ckbd.o:
kbd.cdefs.hcommand.hcc-ckbd.ccommand.o:
command.cdefs.hcommand.hcc-ccommand.cdisplay.o:
display.cdefs.hbuffer.hcc-cdisplay.cinsert.o:
insert.cdefs.hbuffer.hcc-cinsert.csearch.o:
search.cdefs.hbuffer.hcc-csearch.cfiles.o:
files.cdefs.hbuffer.hcommand.hcc-cfiles.cutils.o:
utils.cdefs.hcc-cutils.cclean:
rmeditmain.okbd.ocommand.odisplay.oinsert.osearch.ofiles.outils.o,Debug/release模式,VC+中的DEBUG模式帮你做了什么?
Debug都做了什么,/Od关闭优化/D_DEBUG”#define_DEBUG/GZ用不同的数值填充内存区域/Zi为可执行程序写入调试信息,可以设置断点、单步执行等,