一.预处理器-编译器-汇编器-链接器
预处理器会处理相关的预处理指令,一般是以"#"开头的指令。如:#include "xx.h" #define等。
编译器把对应的*.cpp翻译成*.s文件(汇编语言)。
汇编器则处理*.s生成对应的*.o文件(obj目标文件)
最后链接器把所有的*.o文件链接成一个可执行文件(?.exe)
1.部件:
首先要知道部件(可以暂且狭义地理解为一个类)一般分为头文件(我喜欢称为接口,如:*.h)及实现文件(如:*.cpp)。
一般头文件会是放一些用来作声明的东东作为接口而存在的。
而实现文件主要是实现的具体代码。
2.编译单个文件:
记住IDE在bulid文件时只编译实现文件(如*.cpp)来产生obj,在vc下你可以对某个?.cpp按下ctrl+f7单独编译它
生成对应一个?.obj文件。在编译?.cpp时IDE会在?.cpp中按顺序处理用#include包括进来的头文件
(如果该头文件中又#include有文件,同样会按顺序跟进处理各个头文件,如此递归。。)
3.内部链接与外部链接:
内、外链接是比较基础的东东,但是也是新手最容易错的地方,所以这里有必要祥细讨论一下。
内部链接产生的符号只在本地?.obj中可见,而外部链接的符号是所有*.obj之间可见的。
如:用inline的是内部链接,在文件头中直接声明的变量、不带inline的全局函数都是外部链接。
在文件头中类的内部声明的函数(不带函数体)是外部链接,而带函数体一般会是内部链接(因为IDE会尽量把它作为内联函数)
认识内部链接与外部链接有什么作用呢?下面用vc6举个例子:
// 文件main.cpp内容:
void main(){}
// 文件t1.cpp内容:
#include "a.h"
void Test1(){ Foo(); }
// 文件t2.cpp内容:
#include "a.h"
void Test2(){ Foo(); }
// 文件a.h内容:
void Foo( ){ }
好,用vc生成一个空的console程序(File - new - projects - win32 console application),并关掉预编译选项开关
(project - setting - Cagegoryrecompiled Headers - Not using precompiled headers)
现在你打开t1.cpp按ctrl+f7编译生成t1.obj通过
打开t2.cpp按ctrl+f7编译生成t2.obj通过
而当你链接时会发