我无法理解导致我遇到的LNK2005错误的原因。 假设你有一个A类:
档案A.h:
#ifndef A_H
#define A_H
class A{
public:
static foo(void);
private:
static bool m_someVar;
};
bool A::m_someVar = false;
#endif
文件A.cpp:
#include "A.h"
void A::foo(){
m_someVar = true;
}
上面的代码会导致LNK 2005,但以下代码不会:
档案A.h:
#ifndef A_H
#define A_H
class A{
public:
static foo(void);
private:
static bool m_someVar;
};
#endif
文件A.cpp:
#include "A.h"
bool A::m_someVar = false;
void A::foo(){
m_someVar = true;
}
有人可以解释为什么即使我有警卫也会发生这种情况?我还应该添加#pragma一次吗?
提前致谢。
编辑:这是编译错误: “错误LNK2005:”private:static bool GameManager :: m_isGameOver“(?m_isGameOver @ GameManager @@ 0_NA)已在Execution.obj中定义”
答案 0 :(得分:3)
编译单元是一个.cpp文件和所有包含的标头。每个.cpp创建一个包含代码的中间阶段二进制表示的目标文件,这是编译阶段。然后在链接阶段将这些目标文件链接在一起。因为每个.cpp都是用c ++单独处理的,如果你有" float foo;"在header.hpp中,a.cpp和b.cpp都包含header.hpp,编译器在运行应用程序时如何知道你的意思?
答案 1 :(得分:1)
A"静态"类声明中的变量实际上是该类范围内的extern变量的声明。与每个外部变量一样,它需要恰好一个源文件中的定义。否则,链接器会抱怨它。
您可能包含来自多个源文件的.h文件,因此您有多个定义。