C/C++编译过程理解
来源:互联网 发布:影响网络成瘾的因素 编辑:程序博客网 时间:2024/06/15 05:16
1.首先是预编译,这一步可以粗略的认为只做了一件事情,那就是“宏展开”,也就是对那些#***的命令的一种展开,例如define MAX 1000就是建立起MAX和1000之间的对等关系,好在编译阶段进行替换。例如ifdef/ifndef就是从一个文件中有选择性的挑出一些符合条件的代码来交给下一步的编译阶段来处理。这里面最复杂的莫过于include了,其实也很简单,就是相当于把那个对应的文件里面的内容一下子替换到这条include***语句的地方来。
其次是编译,这一步很重要,编译是以一个个独立的文件作为单元的,一个文件就会编译出一个目标文件。(这里插入一点关于编译的文件的说明,编译器通过后缀名来辨识是否编译该文件,因此“.h”的头文件一概不理会,而“.cpp”的源文件一律都要被编译,我实验过把.h文件的后缀名改为.cpp,然后在include的地方相应的改为***.cpp,这样一来,编译器就会编译许多不必要的头文件,只不过头文件里我们通常只放置声明而不是定义,因此最后链接生成的可执行文件的大小是不会改变的)清楚编译是以一个个单独的文件为单元的,这一点很重要,因此编译只负责本单元的那些事,而对外部的事情一概不理会,在这一步里,我们可以调用一个函数而不必给出这个函数的定义,但是要在调用前得到这个函数的声明(其实这就是include的本质,不就是为了给你提前提供个声明而好让你使用吗?至于那个函数到底是如何实现的,需要在链接这一步里去找函数的入口地址。因此提供声明的方式可以是用include把放在别的文件中的声明拿过来,也可以是在调用之前自己写一句void max(int,int);都行。),编译阶段剩下的事情就是分析语法的正确性之类的工作了。好啦,总结一下,可以粗略的认为编译阶段分两步:第一步,检验函数或者变量是否存在它们的声明;第二步,检查语句是否符合C++语法。
最后一步是链接,它会把所有编译好的单元全部链接为一个整体文件,其实这一步可以比作一个“连线”的过程,比如A文件用了B文件中的函数,那么链接的这一步会建立起这个关联。链接时最重要的我认为是检查全局空间里面是不是有重复定义或者缺失定义。这也就解释了为什么我们一般不在头文件中出现定义,因为头文件有可能被释放到多个源文件中,每个源文件都会单独编译,链接时就会发现全局空间中有多个定义了。
- C/C++编译过程理解
- C&C++编译过程理解
- C/C++编译过程理解
- C/C++编译过程理解
- C/C++编译过程理解
- C/C++编译过程理解
- C/C++编译过程简单理解
- 关于C语言的理解和编译过程
- C编译过程
- C编译过程
- C语言编译过程
- C语言编译过程
- C语言编译过程
- c代码编译过程
- C语言编译过程
- c语言编译过程
- C程序编译过程
- C程序编译过程
- zoj 3662 Math Magic 【dp】【2012 长春现场赛】
- [奇葩方法]三元环题解
- 传入一个ip地址判读该ip地址是否是正确的ip地址形式
- android 安全机制
- 中兴移动的笔试题,字符串的移动
- C/C++编译过程理解
- 谈谈你对面向对象编程的认识(小米 2012/9/11)
- 《计算机组成与设计》笔记(part1)(自学加菜鸟,水平非常有限,不喜勿喷,谢咯)
- Android APK反编译详解(附图)
- zoj 3644(关于最小公倍数的DP)
- 你的SQL Server日志增长参数设置的正确吗?
- 《宝岛双雄》观后感
- 动态继承
- 有符号数转换中"符号位扩展"