c++程序编译流程
来源:互联网 发布:同花顺开户软件 编辑:程序博客网 时间:2024/06/06 19:31
预处理指令是在编译器进行编译之前进行的操作.预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。可见预处理过程先于编译器对源代码进行处理。在很多编程语言中,并没有任何内在的机制来完成如下一些功能:在编译时包含其他源文件、定义宏、根据条件决定编译时是否包含某些代码(防止重复包含某些文件)。要完成这些工作,就需要使用预处理程序。尽管在目前绝大多数编译器都包含了预处理程序,但通常认为它们是独立于编译器的。预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行响应的转换。预处理过程还会删除程序中的注释和多余的空白字符。
unresolved external link或者duplicated external simbol
让我们总结一下:编译器把一个cpp编译为目标文件的时候,除了要在目标文件里写入cpp里包含的数据和代码,还要至少提供3个表:未解决符号表,导出符号表和地址重定向表。
(1)#define Update UpdateW仅仅针对本cpp,对于另外的cpp无用
(2)不可以在.h文件中定义实体
1. 预处理
预处理相当于根据预处理指令组装新的C/C++程序。经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内容上有所不同。
读取C/C++源程序,对其中的伪指令(以#开头的指令)进行处理
①将所有的“#define”删除,并且展开所有的宏定义
②处理所有的条件编译指令,如:“#if”、“#ifdef”、“#elif”、“#else”、“endif”等。这些伪指令的引入使得程序员可以通过定义不同的宏来决定编译程序对哪些代码进行处理。预编译程序将根据有关的文件,将那些不必要的代码过滤掉。
③处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置。
(注意:这个过程可能是递归进行的,也就是说被包含的文件可能还包含其他文件)
删除所有的注释
添加行号和文件名标识。
以便于编译时编译器产生调试用的行号信息及用于编译时产生的编译错误或警告时能够显示行号
保留所有的#pragma编译器指令(#pragma用于编译期,简单的说就是告诉计算机编译的时候只编译一次,跟。h文件加入cpp中没有半毛钱关系,。h文件加入cpp是预处理期间的活动,所以,你不可以#include "uu.h"#include "uu.h"#include "uu.h"这样反复的用int a = 12;因为这样预处理期间会把3个int a = 12;放到cpp文件中,那你就重复定义了,所以,不要在。h文件中定义,
只声明就可以了也不对,还是会错误LNK1169找到一个或多个多重定义的符号,全局变量不是这样用的,可以辅助static,extern)
为什么头文件里一般只可以有声明不能有定义:头文件可以被多个编译单元包含,如果头文件里有定义,那么每个包含这个头文件的编译单元就都会对同一个符号进行定义,如果该符号为外部链接,则会导致duplicated external simbols。因此如果头文件里要定义,必须保证定义的符号只能具有内部链接。
- c程序编译流程
- C/C++程序编译流程
- 编译C程序的流程
- C/C++程序编译流程(预处理->编译->汇编->链接)
- C/C++程序编译流程(预处理->编译->汇编->链接)
- 程序的编译流程
- c++程序编译流程
- c++程序编译流程
- C语言编译流程
- C&C++编译流程
- C语言编译流程
- C/C++程序编译流程解析(预处理->编译->汇编->链接)
- 【Linux C/C++】 第02讲 HelloWorld程序编译流程详解
- 编译Android驱动对应的C测试程序出错的解决方法以及正确流程
- 编译Android驱动对应的C测试程序出错的解决方法以及正确流程
- 编译Android驱动对应的C测试程序出错的解决方法以及正确流程
- 一图读懂-------C程序从写代码到编译到执行流程。
- c程序编译
- Activity滑动关闭的效果
- 记录android Property Animation(属性动画)
- C#构造表头和表体json
- Maven安装和配置,eclipse创建Maven项目
- node.js模块小记之--fs
- c++程序编译流程
- 案例--编写一个Servlet,显示已有用户信息,可添加/修改、删除帐务帐号信息,并重新显示新页面
- PAT 1007 乙等 (素数对猜想) c++
- windows c++使用hiredis同步模式实现发布订阅
- Spring注解
- 深搜输出可能的硬币组合
- jquery validate
- plsql未响应解决办法
- eclipse安装adt插件后工具栏不显示android相关图标