您好我刚刚创建了一个示例类并在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,实际上有些东西会在我们认为包含在很多地方时声明数据。有人会清楚地解释为什么它会给出那个链接错误。
答案 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)包含变量定义。