看了一些关于C++的文章,暂且先记录一下自己的想法:
C++编译原理(以VS为例): 1、预编译(C++代码(有宏)---->C++代码(无宏)):编译器解析宏,将代码中存在宏的代码替换为宏定义的字符、C++的inline(内联)函数也是在此时替换的。 此时编译器是否已经分析出了cpp文件的信息,如cpp编译后的文件运行时需要的大小,cpp文件中每个函数的大小之类的信息呢?(问题0) 2、编译(C++代码(无宏)------->汇编语言):编译器将C++代码解释为汇编语言,编译以一个cpp文件为单位,此时每个cpp文件包含(#include)的.h文件也会包含在其中,#ifndef#define的作用就是在此时(防止头文件的重复包含)。 在使用VS的时候,我们没有看到汇编语言的文件,但它的确是存在的,调出方法: 1)VS2005: 项目 ---》属性 ---》 配置属性 ---》 c/c++ ---》 输出文件 ---》 右边内容项:汇编输出 ---》带源代码的程序集(/FAs )。 这样在项目里面生成后缀为*.asm 的文件(汇编文件)。里面还有注释,有利于分析。 此时编译器应该已经分析出现了 未解决符号表,导出符号表和地址重定向表 这三张表,但这三张表是如何被编译器分析出的呢?(分析过程?问题2)这三张表在.obj文件中以什么形式存在?(.obj的结构是什么,问题3) 4、链接(.obj文件---------------------->exe文件/dll文件):C++的编译是已cpp文件为单位的,多少个cpp文件生成多少个对应的.obj文件,此时编译器负责为每个.obj文件分配其在exe文件中的位置(可能是预编译的时候分析出来的),然后根据.obj文件中的那三张表,为.obj文件之间互通有无,最后形成一个exe/dll文件。 |
C++小结-编译原理
最新推荐文章于 2024-06-12 22:01:58 发布