C++中两个文件读取一个.h时多个多重定义错误

我有个tools.h文件里面创建了全局变量Mapmain里我用memset给map设初值然后tools里的updateMap函数用来刷新Map报错说错误1errorLNK... 我有个tools.h文件 里面创建了全局变量Map

main里我用memset给map设初值

然后tools里的updateMap函数用来刷新Map

报错说
错误 1 error LNK2005: "char (* Map)[40]" (?Map@@3PAY0CI@DA) 已经在 glutt.obj 中定义 C:\Users\User\Documents\GitHub\C++\glutt\glutt\tools.obj glutt

但是我在tools.h里定义了
#ifndef _TOOL_H_
#define _TOOL_H_

所以第二次尝试导入不是会直接跳过吗? 为啥还会重定义
展开
 我来答
memberwin
2014-12-16 · TA获得超过3903个赞
知道大有可为答主
回答量:1000
采纳率:100%
帮助的人:510万
展开全部
从昨晚到现在查了很多东西,但结果却超级简单:
首先#include在编译时会被预处理器将.h中的所有内容拷贝到当前文件中, 如果.h中还include了别的.h, 则递归拷贝;
如果.h文件中没有头文件保护,即#ifndef ... #define ... #endif则如果某文件include 1.h和 3.h, 而1.h也#include了3.h, 则会有完全相同的两份3.h中的代码, 这样就直接报错了; 但加入了头文件保护后就可以保证在单一文件中只会编译一遍3.h的代码;
所以到目前为止如果加入了头文件保护,在单一文件中不会有重声明(定义),编译可以通过,生成各个.o文件了, 头文件中定义的变量都定义并分配了空间,就你的问题而言,tool.o中有Map, 同时main.o中也有Map;
然后就是链接了,此时会将各.o中的全局符号加入全局符号表中,如果.o中有相同的全局变量则会报重定义, 即tool.o和main.o中的Map冲突了。

总结下:头文件保护只是保证在 单一文件中不会重复include, 但不保证在不同文件中重复include。

解决办法为在.h中只声明变量: extern map Map; 而在tool.cpp中定义: map Map;

多谢问题哈,终于搞清楚了这个问题!
金色潜鸟
2014-12-15 · TA获得超过3.2万个赞
知道大有可为答主
回答量:1.3万
采纳率:89%
帮助的人:5702万
展开全部
#ifndef _TOOL_H_
#define _TOOL_H_
// 定义内容嵌入这里
#endif // 条件结束标志 不要漏了
追问
没漏 不然vs会检测到的
追答
那么 括的位置 是否正确 -- 语法,语意。
还有,主函数前面 要有 updateMap() 函数的原型声明。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式