C++程序生成过程.pptx_第1页
C++程序生成过程.pptx_第2页
C++程序生成过程.pptx_第3页
C++程序生成过程.pptx_第4页
C++程序生成过程.pptx_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C+程序生成过程,高嵩,程序生成的三个步骤,编译预处理 #include文件引入,宏展开,预编译指令处理,模板展开 分别编译 每个编译单位(经过预处理的文件)独立的进行编译 链接 保证每个编译单位中符号意义的一致,编译预处理,纯文本操作,从源文件到编译单元,头文件,编译器不区分头文件与普通程序文件,只是提供了#include预编译指令 头文件通过#include预编译指令引入 #include ”headFile.h” 使用头文件的全文替换#include所在行 STL头文件使用#include的形式,xxxx是否是一个文件由实现定义 头文件保护 经典的#ifndef #pragma once

2、 (实现定义,vc/gcc/icc均支持),宏与模板,#define 简单的替换,尽量避免使用 模板也是宏的一种,在预处理阶段展开 使用宏与模板时,宏与模板的全部信息必须位于当前文件中(单次扫描编译),编译,单次扫描编译器从编译单元生成目标码文件,单次扫描编译,编译器每次只处理一个文件,每个文件只处理一次。编译一个文件时不能获得其他文件的信息 若需要使用其他编译单元【定义】的符号,必须在本编译单元中【声明】,定义与声明,一般来说,实际分配空间的就是定义,否则就是声明 类?模板?,头文件的注意事项,可以有 一般只包含各类声明 类与模板可以在头文件中定义 单一定义规则(One-Definition

3、 Rule, ODR) 可以包含const常量/inline函数的定义 不能有 绝不能有数据或函数的定义 不应包含using操作 不应包含#define ,编译工作,为当前编译单元中定义的数据分配地址空间 将当前编译单元中的函数转为机器码,外部符号的地址会暂时空出来等待链接时处理 产生三个表,与链接相关的三个表,未解决符号表(unresolved symbol table) 导出符号表(export symbol table) 地址重定向表(address redirect table),链接,将各个编译单元目标代码组织起来,链接原理,在所有编译单元中,每个符号必须恰好只【定义】一次(ODR标

4、准的类与模板定义除外),可以【声明】多次。 链接即确定不同编译单元中符号的引用关系,确定具体地址,并计算偏移量,外部链接与内部链接,一个符号若可以在其他编译单元中使用,称为具有【外部链接】,否则称为【内部链接】 const数据/inline函数具有内部链接(具体参考标准与具体实现) 外部链接实际就是将符号加入导出符号表 可以使用extern强制const数据外部链接,链接步骤,确定各个目标文件在最终可执行文件里的位置 对目标文件中记录的符号地址进行重定向 查找导出符号表,在未解决符号表记录的所有位置上填写实际地址 将所有目标文件写到最终可执行文件的各个位置上,常见错误,无法解析的外部符号(un

5、resolved external link) 符号重定义(duplicated external symbols),非法的例子,/ file1.cpp int a; int b = 1; extern int c; / file2. cpp int a; extern double b; extern int c;,问题,为什么前面讲头文件中一般只包含声明而不包含定义?,Makefile,自动化的程序生成,Makefile是什么,自动化的完成一个指定的目标 多用于程序的自动生成 自动根据依赖关系顺序执行命令 可以自动根据时间判断是否需要重新执行某步骤,Makefile的基本结构,标签 : 标

6、签1 标签2 命令1 命令2,一个简单的Makefile,edit:main.okbd.ocommand.odisplay.o insert.osearch.ofiles.outils.o cc-oeditmain.okbd.ocommand.odisplay.oinsert.osearch.ofiles.outils.o main.o:main.cdefs.h cc-cmain.c kbd.o:kbd.cdefs.hcommand.h cc-ckbd.c command.o:command.cdefs.hcommand.h cc-ccommand.c display.o:display.cdefs.hbuffer.h cc-cdisplay.c insert.o:insert.cdefs.hbuffer.h cc-cinsert.c search.o:search.cdefs.hbuffer.h cc-csearch.c files.o:files.cdefs.hbuffer.hcommand.h cc-cfiles.c utils.o:utils.cdefs.h cc-cutils.c clean: rmeditmain.okbd.ocommand.odisplay.oinsert.osearch.ofiles.outils.o,Debug/release模式,VC+

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论