永发信息网

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

答案:2  悬赏:10  手机版
解决时间 2021-03-15 01:08
C++中两个文件读取一个.h时多个多重定义错误?
最佳答案
首先#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在编译时会被预处理器将.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; 多谢问题哈,终于搞清楚了这个问题!
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
《记金华的双龙洞》第五段里的三条段义
快客(东二胡同店)这个地址在什么地方,我要处
15分请教文学高手。形容设计图案,用什么词语
金多子是什么?
浙江滋福堂得心医药零售连锁有限公司新安路分
取痣了之后jiudian留下印子该怎么去除
我蛀牙前两年拔掉了,但是不知道是不是昨天吃
毛坦港湾怎么样?好不好?值不值得买?
君闻香人参酒怎么样
小华和小明一起做针孔照相机。他们在两个空易
03帕萨特2.4自动油耗在多少
周坊大桥/宝躁线(路口)我想知道这个在什么地
肺叶出现小结灶是不是肺癌
看一个男人的品味,是观察他的衣着,还是手表
$10.00/mo是什么意思
推荐资讯
小鹿犬一顿吃多少?
小乌桶在什么地方啊,我要过去处理事情
我们是做学生托管班的,希望开一家儿童夏令营
读图虚线表示等潜水位线,等潜水位距为8m;实
有什么适合12岁的小孩玩的网页游戏
单选题胡老师从河北到西藏工作,半年后体检时
单选题为我国中医学奠定理论基础的是A.《黄帝
兔子可以吃煮熟的玉米吗
易拉罐装的旺仔牛奶十四个月了打开里面看着跟
民意街天仁社区怎么去啊,有知道地址的么
新鑫阳光广告呼图壁县分公司我想知道这个在什
淘宝店买家不退货只要求退款怎么办
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?