BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #95793同步于 2017/7/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

非常困惑,头文件中函数重复定义的问题,求解疑

byr10086
2017/7/17镜像同步23 回复
问题是这样的: 在一个头文件中定义了一个类和一个函数(不是类的成员函数),并且使用了头文件保护符(#ifndef...#define...#endif...) 另有两个.cc文件都include了该头文件,当把这两个.cc文件一起编译时,会报函数重复定义的错误,但没有类重复定义的错误。 不明白为函数会有重复定义的错误,而类没有重复定义的错误,想请教一下大家,万谢!!!
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
lmike机器人#1 · 2017/7/17
问题出在链接阶段。你编译出的两个目标文件的函数导出表中都有这个相同名字的函数且不是static,所以调用函数的时候应该选择哪个?当然重复定义了。 【 在 byr10086 (nieng) 的大作中提到: 】 : 问题是这样的: : 在一个头文件中定义了一个类和一个函数(不是类的成员函数),并且使用了头文件保护符(#ifndef...#define...#endif...) : 另有两个.cc文件都include了该头文件,当把这两个.cc文件一起编译时,会报函数重复定义的错误,但没有类重复定义的错误。 : ...................
byr10086机器人#2 · 2017/7/17
那类为什么没出现这种问题? 【 在 lmike (虫二) 的大作中提到: 】 : 问题出在链接阶段。你编译出的两个目标文件的函数导出表中都有这个相同名字的函数且不是static,所以调用函数的时候应该选择哪个?当然重复定义了。
flyfree机器人#3 · 2017/7/17
试一试把函数的声明放到.h中,函数的实现放到.c中试试,.h中不要放函数的实现。
Forec机器人#4 · 2017/7/18
猜是你把函数实现也放在头文件里了 【 在 lmike (虫二) 的大作中提到: 】 : 问题出在链接阶段。你编译出的两个目标文件的函数导出表中都有这个相同名字的函数且不是static,所以调用函数的时候应该选择哪个?当然重复定义了。
Forec机器人#5 · 2017/7/18
回复错了不好意思 【 在 lmike (虫二) 的大作中提到: 】 : 问题出在链接阶段。你编译出的两个目标文件的函数导出表中都有这个相同名字的函数且不是static,所以调用函数的时候应该选择哪个?当然重复定义了。
nvyoujiaren机器人#6 · 2017/7/18
楼上学的很扎实啊,哈哈!
byr10086机器人#7 · 2017/7/18
@nuanyangyang
nuanyangyang机器人#8 · 2017/7/18
秀一下代码。如果不便公开,就改名、裁剪到只剩下一个空类和一个空函数,总之只要能重现问题就好。 【 在 byr10086 的大作中提到: 】 : @nuanyangyang
byr10086机器人#9 · 2017/7/18
【 在 nuanyangyang 的大作中提到: 】 : 秀一下代码。如果不便公开,就改名、裁剪到只剩下一个空类和一个空函数,总之只要能重现问题就好。 : 代码大概就像下面这样,编译时报错函数func()多重定义,这个可以理解,但为什么类 A 却没有多重定义的报错?? head.h ``` #ifndef HEAD_H #define HEAD_H #include <iostream> using namespace std; class A{ public: int x; }; int func(){ int a =5; return a; } #endif ``` test1.cc ``` #include <iostream> #include "head.h" int main(){ A a; a.x = 8; std::cout<<a.x<<endl; } ``` test2.cc ``` #include <iostream> #include "head.h" void hello(){ A b; b.x = 9; std::cout<<b.x<<endl; } ```