我收到以下错误。我不知道它发生在哪里?哪有错呢。 我正在开发一些代码,
abc.h
#include<vector>
vector<string> vect;
vector<string>::iterator ab;
def.c
#include "abc.h"
vect.push_back("a");
vect.push_back("b");
for(ab = vect.begin(); ab != vect.end(); ab++)
{
if(*ab == "b")
{
FIle *file->fun();
}
abc.c
#include "abc.h"
File::file()
{
vect.insert(1, "Something");
}
我收到错误
"class std::_Vector_iterator<class std::_Vector_val<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > > testCase" (?testCase@@3V?$_Vector_iterator@V?$_Vector_val@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@@std@@A) already defined in abc.obj
1>GTestThread.obj : error LNK2005: "class std::vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > vect" (?vect@@3V?$vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@A) already defined in abc.obj
1>D:/ fatal error LNK1169: one or more multiply defined symbols found
答案 0 :(得分:2)
此:
vector<string> vect;
vector<string>::iterator ab;
是标题中的定义,这意味着当您在多个翻译单元中包含标题时,您将打破一个定义规则。将其更改为:
//abc.h
extern vector<string> vect;
extern vector<string>::iterator ab;
使其成为声明并将定义移动到单个实现文件中:
//abc.c
#include "abc.h"
vector<string> vect;
vector<string>::iterator ab;
我仍然想知道你的def.c
是如何编译的,你不能只在上下文之外的实现文件中粘贴语句。
此外,C ++还有.cc
或.cpp
(我认为是其他人),而不是.c
。
答案 1 :(得分:1)
您通常不会在头文件中定义类似vect
之类的内容,因为包含它的每个C ++文件都会获得自己的副本,因此会出现重复的符号警告。
在标题中声明:
extern vector <string> vect;
然后在一个的C ++文件中定义它。