关于VS2008编译连接过程中出现重定义的问题
2011-08-23 10:03
806 查看
最近在做程序的时候,突然出现了连接过程中重定义的问题,因为本人是新手,一时间有点手忙脚乱,通过经验人士的指点和在网上查到的资料,问题原因如下,本人语言组织能力有限(摘录牛人帖子):
一个简单的project中有三个文件main.cpp, a.cpp, a.h,而 main.cpp 和a.cpp分别包含了a.h, 在编译阶段, 两个编译单元是都会分别包含a.h的, 即使他们使用了#ifndef#define#endif, 这也是为什么当a.h被多个文件包含时我们不允许在a.h中定义变量及函数的原因, 因为在链接阶段会出现重定义。 但是在a.h中定义一个static变量却是允许的, 因为static变量是模块性作用域, 就这个例子来说, 若我们在a.h中写static
int sss = 0;那么main.cpp与a.cpp使用的sss将为2个独立的sss.
那么是否#ifndef#define#endif就没用了呢, 大家可以想想, 当我们a.cpp中写了多个#include "a.h"时, 如果我们使用了#ifndef#define#endif那么预编译阶段就只会包含一个a.h中的内容到a.cpp中, 你也许会说, 有谁会傻到在a.cpp中写多个#include "a.h"呢, 那么请考虑稍微复杂点的情况, 当我们main.cpp中包含了a.h和b.h,
而a.h中我们又包含了b.h, 那么如果我们使用了#ifndef#define#endif则main.obj只会包含一份b.h
一个简单的project中有三个文件main.cpp, a.cpp, a.h,而 main.cpp 和a.cpp分别包含了a.h, 在编译阶段, 两个编译单元是都会分别包含a.h的, 即使他们使用了#ifndef#define#endif, 这也是为什么当a.h被多个文件包含时我们不允许在a.h中定义变量及函数的原因, 因为在链接阶段会出现重定义。 但是在a.h中定义一个static变量却是允许的, 因为static变量是模块性作用域, 就这个例子来说, 若我们在a.h中写static
int sss = 0;那么main.cpp与a.cpp使用的sss将为2个独立的sss.
那么是否#ifndef#define#endif就没用了呢, 大家可以想想, 当我们a.cpp中写了多个#include "a.h"时, 如果我们使用了#ifndef#define#endif那么预编译阶段就只会包含一个a.h中的内容到a.cpp中, 你也许会说, 有谁会傻到在a.cpp中写多个#include "a.h"呢, 那么请考虑稍微复杂点的情况, 当我们main.cpp中包含了a.h和b.h,
而a.h中我们又包含了b.h, 那么如果我们使用了#ifndef#define#endif则main.obj只会包含一份b.h
相关文章推荐
- vs2008编译连接出现的一个问题
- 关于登录sql server 2005 出现“已成功与服务器建立连接,但是在登录过程中发生错取。(provider:共享内存提供程序,error:0-管道的另一端上无任何进程”的问题
- 关于Qt交叉编译过程中出现的collect2: ld returned 1 exit status问题的解决方案
- 关于php访问mssql2008过程中出现的问题
- 关于编译x264时出现的for Cortex-A8 erratum because it has no mapping symbols问题
- Qt编译过程中出现的问题
- 《见习小恶魔》源代码编译过程中可能出现的问题及解决方法
- 关于在linux下编译内核出现的一些问题
- 关于sql server 在存储过程中创建临时表,并往临时表中插入数据时出现乱码的问题
- windows 7或者windows 10 vs2008-vs2013 下boost_1_47_0 安装的过程和出现的问题详解
- 关于使用Android6.0编译程序时,出现getSlotFromBufferLocked: unknown buffer: 0xac0f8650问题的解释
- 关于定义的alert和confirm出现闪退问题
- 最近在ArcGIS Engine开发中关于调用gp工具过程出现COM 组件的调用返回了错误 HRESULT E_FAIL 错误的解决方法 和 学习oracle中遇到的一些问题总结
- 关于双击cpp文件无法直接打开,VS2008提示“向程序发送命令时出现问题”的解决
- VS2008编译Qt4程序出现的问题
- 关于 window c++ 编译 soket 重复定义的问题
- 关于 TerminateProcess函数 在c++的进程中的学习而发现VS2008的编译安全问题
- 关于codewarrior调试出现illegal BP的问题解决过程(转载)
- 关于Jedis连接Linux上的redis出现 DENIED Redis is running in protected mode问题的解决方案
- 我把一个VC6的工程转换为VS2008的工程后,编译总是出现找不到而且不能升级vc90.pdb文件的问题,error C2471--解决办法 2010-9-16 15:01