编译错误“redefinition of 'string' as different kind of symbol”

oscarjiao 2014-02-27 01:38:18
我定义了一个返回类型是std::string的函数在read_qacct.h里
#include <string>
std::string read_qacct(std::string login, int days);


然后在db2class.cpp里include了这个头文件
#include "read_qacct.h"


结果编译db2class.cpp时的第一个错误就是:

In file included from db2class.cpp:8:
./read_qacct.h:2:6: error: redefinition of 'string' as different kind of symbol
std::string read_qacct(std::string login, int days);
^
/usr/include/c++/4.2.1/bits/stringfwd.h:59:33: note: previous definition is here
typedef basic_string<char> string;

我用同样方式在read_qacct.cpp里include这个头文件,编译read_qacct.cpp没有任何问题,为什么这里会出错呢?
...全文
1938 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
oscarjiao 2014-02-28
  • 打赏
  • 举报
回复
引用 7 楼 mujiok2003 的回复:
[quote=引用 4 楼 oscarjiao 的回复:] [quote=引用 2 楼 vipcxj 的回复:] 没有加 #ifndef XXX #define XXX #endif ?
加了以后貌似没错了,每个头文件都要加这个吗?到底起什么作用?[/quote] 不应该啊, 函数声明可以有多次的。[/quote] 我发现只有当我同时编译db2class.cpp和read_qacct.cpp时,会报这个错,这个就好解释了,因为这两个cpp都include了read_qacct.h。
oscarjiao 2014-02-28
  • 打赏
  • 举报
回复
引用 6 楼 Automation_dmu 的回复:
想必你把read_qacct的定义都放到read_qacct.h里了吧
我的read_qacct.h里只有声明 #ifndef READ_QACCT_ONCE #define READ_QACCT_ONCE #include <string> std::string read_qacct(std::string login, int days); #endif 函数的definition是在read_qacct.cpp里
dbzhang800 2014-02-28
  • 打赏
  • 举报
回复
引用 9 楼 oscarjiao 的回复:
[quote=引用 7 楼 mujiok2003 的回复:] [quote=引用 4 楼 oscarjiao 的回复:] [quote=引用 2 楼 vipcxj 的回复:] 没有加 #ifndef XXX #define XXX #endif ?
加了以后貌似没错了,每个头文件都要加这个吗?到底起什么作用?[/quote] 不应该啊, 函数声明可以有多次的。[/quote] 我发现只有当我同时编译db2class.cpp和read_qacct.cpp时,会报这个错,这个就好解释了,因为这两个cpp都include了read_qacct.h。[/quote] 这个也没办法解释你的问题,同时编译两个编译单元不应该有问题。
mujiok2003 2014-02-28
  • 打赏
  • 举报
回复
引用 4 楼 oscarjiao 的回复:
[quote=引用 2 楼 vipcxj 的回复:] 没有加 #ifndef XXX #define XXX #endif ?
加了以后貌似没错了,每个头文件都要加这个吗?到底起什么作用?[/quote] 不应该啊, 函数声明可以有多次的。
AndyStevens 2014-02-28
  • 打赏
  • 举报
回复
想必你把read_qacct的定义都放到read_qacct.h里了吧
vipcxj 2014-02-28
  • 打赏
  • 举报
回复
引用 4 楼 oscarjiao 的回复:
[quote=引用 2 楼 vipcxj 的回复:] 没有加 #ifndef XXX #define XXX #endif ?
加了以后貌似没错了,每个头文件都要加这个吗?到底起什么作用?[/quote] 如果你加对了照理说应该已经知道它的功能啦,防止头文件被重复包含。其实如果你知道怎么用宏,也很好理解。你的错误应该就是头文件被重复包含,导致read_qacct被声明了2次~ 这个宏通过先判断有没有定义XXX(一般就是头文件名字的大写,空格用_代替),如果没有就定义之,然后是头文件的内容。如果第二次包含了一个此头文件,因为已经定义了XXX,所以ifndef里面的东西,也就是头文件的内容就被忽略了
oscarjiao 2014-02-27
  • 打赏
  • 举报
回复
引用 2 楼 vipcxj 的回复:
没有加 #ifndef XXX #define XXX #endif ?
加了以后貌似没错了,每个头文件都要加这个吗?到底起什么作用?
sniffer12345 2014-02-27
  • 打赏
  • 举报
回复
检查头文件里头有没有using namespace 然后命名冲突了
vipcxj 2014-02-27
  • 打赏
  • 举报
回复
没有加 #ifndef XXX #define XXX #endif ?
__cc__ 2014-02-27
  • 打赏
  • 举报
回复
代码上没有任何问题,还有可能是源文件存在隐藏的字符,或者其它代码导致问题。

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧