已定义错误

Error already defined

本文关键字:错误 定义      更新时间:2023-10-16

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

样本.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,实际上,一旦认为我们在很多地方都包含了数据,就会有东西声明数据。有人能解释清楚为什么它会给出链接错误吗

请记住,#include的字面意思是"在此处添加此文件的内容"
Include guards只保护文件的内容不被包含在中的每个文件多次包含

当预处理器完成预处理时,编译器会看到:

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;放在标头中。)

要使这样的全局变量随处可见:

等等

extern int count;

blah.cpp

int count(10);

Include guards仅用于防止多次包含同一头文件,而不是多个定义。为了不违反ODR,您应该在cpp文件中移动变量,或者使用内部链接,或者将其声明为外部并在某个地方定义一次。根据该变量的使用情况,有多种解决方案。

注意,我忽略了一个事实,即您可能是指sample.cpp文件中的int sample::Get()

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

您必须声明变量计数具有内部链接,例如

#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)包含变量定义。