已定义错误
Error already defined
嗨,我刚刚创建了一个示例类并在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)包含变量定义。
相关文章:
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 使用命名空间时出现多个定义错误
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 编写代码时C++出现错误:错误 1 错误 C2601:'circle':本地函数定义是非法的
- 在运算符重载定义中使用成员函数(const错误)
- 尝试调用 .h 文件中定义的变量时出现变量未定义错误
- 在C++中使用内联方法时出现未定义的符号错误
- 已定义函数时出现 G++ "未定义的引用"错误
- C++ G++ 编译器 - 错误:隐式声明的定义
- 链接 cmake 时出现未定义的引用错误
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 错误:未定义对'oboe::AudioStreamBuilder::openStream(oboe::AudioStream**)'的引用
- 链接阶段出现多重定义错误
- 已经以性格错误定义了
- vim ctag导致了对乐趣的错误定义
- C++ 隐式声明的编译器错误定义
- 编译器错误-定义问题.C++