C++主流预处理,编译和链接过程
来源:互联网 发布:淘宝区域拦截 编辑:程序博客网 时间:2024/05/16 14:32
在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文件。
首先,预处理阶段:
这一过程,主要针对#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文件。
- C++主流预处理,编译和链接过程
- 预处理,编译,链接过程
- linux预处理、编译、汇编、链接和运行的过程
- GCC编译过程:预处理-编译-汇编-链接
- 【C 语言】编译过程 分析 ( 预处理 | 编译 | 汇编 | 链接 | 宏定义 | 条件编译 | 编译器指示字 )
- 预处理、编译、汇编和链接
- GCC编程过程:预处理-编译-汇编-链接
- 理解程序编译预处理与链接过程
- 描述C,C++编译和链接过程
- 描述C,C++编译和链接过程
- C之详解编译和链接过程
- c程序的编译和链接过程
- Linux 环境下C编程指南-----gcc 编译的四大过程(预处理-编译-汇编-链接 )
- c编译链接过程
- 【C++】编译链接过程
- C语言的预处理、编译、汇编、链接
- Linux下C语言执行过程(预处理,编译,汇编,链接,执行)
- gcc 编译的四大过程(预处理-编译-汇编-链接 )
- 码农如何实现高帅富
- python网络编程测试-broadcast
- 我不知道的事——深克隆和浅克隆
- QT程序实例----信号与插槽(signal and slot)
- 解决火车票网上订票难的方案
- C++主流预处理,编译和链接过程
- Oracle数据库中索引的维护
- IE 中的 VBScript 和 JScript 解析引擎
- 网站性能优化的三重境界
- 互联网,可预见的未来
- oracle索引的监控
- 一位软件工程师的6年总结
- asp.net Repeater等数据控件模版内部2个DropDownList控件级联
- Oracle表与索引的分析及索引重建