C++主流预处理,编译和链接过程
在C++的程序的编写过程中,基本上都碰到过LNK2005的错误吧,下面就针对这个问题详细分析:
首先,预处理阶段:
这一过程,主要针对#include和#define进行处理,具体过程如下:
对于cpp文件中经常会出现#include来包含某个头文件,在进行预处理之后,所有的#include命令都将替换成该头文件中的详细内容,如果该头文件中还包含另外的头文件,采用同样的方法进行递归处理。同样#define亦是如此,对用它进行宏定义的字符进行替换,这里就是简单的替换。所以整个预处理过程就是进行简单的替换。
其次,预编译过程
这一过程主要针对预处理之后的cpp文件编译称为obj文件,即目标文件(注意,在这里仅仅是针对cpp文件,对头文件是不做任何处理的,所以在多文件工程中定义全局变量的时候,我们一定要记得把全局变量定义在cpp文件中,因为如果定义在头文件中,我们要使用该变量的话很容易出现already define的错误)。主要是通过编译器和汇编器生成二进制文件,便于链接处理。
对于这个,我给个实例和其解释:
在链接的过程中,用extern申明的变量,我们很明确的知道这是一个外部变量,那么对于此,连接器会到外部的obj文件中区寻找该变量,如果说是我们在该obj文件编译的cpp中有该变量的定义的话,那么这就不是一个声明了,而是一个定义。所以,我们的这个obj文件编译的源文件cpp,千万不要包含有该变量定义的头文件或者cpp文件,否则就是重定义,也就是说有些重定义是在链接的时候才会确定的一个错误,所以最好是在.h文件中用extern进行声明,然后再随便一个cpp文件中进行定义。在你想要使用该变量的cpp文件中只需要包含该头文件即可。
第三,链接过程
如果写程序中没有足够的警觉,在这个过程中极易出现链接错误。首先该过程主要是将众多的obj文件生成exe文件。