错误已定义

时间:2014-10-17 12:51:56

标签: c++ visual-c++

您好我刚刚创建了一个示例类并在main中使用它,但我已经定义了错误。

sample.h

#ifndef __sample__
#define __sample__
#include<iostream>
using namespace std;

int count = 10;

class sample
{
public:
    sample();
    int Get();
private:
    int i;
};
#endif

sample.cpp的

#include "sample.h"
sample::sample()
{
    cout<<"hello two";
}
int sample::sample()
{
    return 10;
}

的main.cpp

#include <iostream>
#include "sample.h"
using namespace std;

int main(void)
{
    int test = count;
    return 0;
}

链接错误: main.obj:错误LNK2005:sample.obj中已经定义了“int count”(?count @@ 3HA)

如果你看到上面的类我正在使用#ifndef和#define,实际上有些东西会在我们认为包含在很多地方时声明数据。有人会清楚地解释为什么它会给出那个链接错误。

4 个答案:

答案 0 :(得分:2)

请记住,#include字面意思是“在此处添加此文件的内容” 包含防护只能防止文件的内容被包含在中的每个文件中多次包含

当预处理器完成预处理时,这就是编译器所看到的:

<强> sample.cpp的

[此处有iostream内容......]

using namespace std;

int count = 10;

class sample
{
public:
    sample();
    int Get();
private:
    int i;
};

sample::sample()
{
    cout<<"hello two";
}
int sample::sample()
{
    return 10;
}

<强>的main.cpp

[此处有iostream内容......]

using namespace std;

int count = 10;

class sample
{
public:
    sample();
    int Get();
private:
    int i;
};

using namespace std;

int main(void)
{
    int test = count;
    return 0;
}

如您所见,有两个定义count,每个文件中有一个(正式名称为“翻译单位”)。

解决方案是在“sample.h”

中声明变量
extern int count;

并在sample.cpp中拥有唯一的定义

int count = 10;

(你不应该将using namespace std;放在标题中。)

答案 1 :(得分:0)

包含警卫只能防止多次包含相同的头文件,而不是多个定义。您应该在cpp文件中移动变量,以免违反ODR,或使用内部链接或将其声明为外部并在某处定义它。根据该变量的使用,有多种解决方案。

请注意,我忽略了您在sample.cpp文件中可能需要int sample::Get()的事实

#include "sample.h"
sample::sample()
{
    cout<<"hello two";
}
int sample::sample() // ??
{
    return 10;
}

答案 2 :(得分:0)

制作一个类似于全局变量的全局变量:

blah.h

extern int count;

blah.cpp

int count(10);

答案 3 :(得分:0)

您要么将变量计数声明为具有内部链接,例如

#ifndef __sample__
#define __sample__
#include<iostream>
using namespace std;

namespace
{
    int count = 10;
}
//...

#endif

(上述内部声明在C ++ 2011中有效)或

#ifndef __sample__
#define __sample__
#include<iostream>
using namespace std;

static int count = 10;

//...

#endif

或者将其声明为具有外部链接,但在某个模块中仅定义一次。 Fpr示例

#ifndef __sample__
#define __sample__
#include<iostream>
using namespace std;

extern int count;

//...

#endif

#include "sample.h"

int count = 10;
sample::sample()
{
    cout<<"hello two";
}
int sample::sample()
{
    return 10;
}

否则,编译器将发出错误,即变量计数被定义多次,即多个编译单元(在本例中为sample.cpp和main.cpp)包含变量定义。