-1

我得到以下错误。我无法理解它发生在哪里?哪里出错了。我正在开发一些代码,

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
4

2 回答 2

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.

于 2012-09-26T12:21:47.237 回答
1

您通常不会在头文件中定义诸如此类vect的内容,因为包含它的每个 C++ 文件都会获得自己的副本,因此会出现重复符号警告。

在标题中声明它:

extern vector <string> vect;

然后在其中一个C++ 文件中定义它。

于 2012-09-26T12:24:12.733 回答