c++静态bool变量
C++ static bool variable
我无法理解导致我遇到的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吗?
提前感谢。
编辑:这是编译错误:"error LNK2005: "private: static bool GameManager::m_isGameOver" (?m_isGameOver@GameManager@@0_NA)已经在execute .obj中定义"
include守卫(#ifndef和#pragma)不能跨编译单元工作,这就是为什么你永远不应该在头文件中定义任何东西,而只声明它们。当然模板除外。
编译单元是一个.cpp文件和所有包含的头文件。每个.cpp创建一个对象文件,其中包含代码的中间阶段二进制表示,这是编译阶段。然后在链接阶段将这些目标文件链接在一起。由于每个.cpp在c++中是单独处理的,如果在header.hpp中有"float foo;",并且a.cpp和b.cpp都包含header.hpp,那么编译器在运行应用程序时如何知道您指的是哪个foo ?
类声明中的"静态"变量实际上是该类作用域内的外部变量的声明。与所有外部变量一样,它需要在中定义一个源文件。否则,链接器会抱怨它。
您可能包含来自多个源文件的.h文件,因此您有多个定义。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 如果 (QString.contains()) 不能正常工作,请使用 temp bool 变量进行更正
- 我可以在没有静音的线程中读取线程中的bool变量
- 在Tensorflow源代码中的Bool变量的初始化
- 线程同步:等待两个bool变量
- 为什么除了直接赋值0之外,bool变量不能设置为0
- 返回递归函数的bool意外地更改了变量
- 如何在bool值为真后停止增加变量
- bool类型变量如何存储在内存中?(c++)
- 我必须对<bool>布尔变量使用原子"exit"吗?
- 可移植的c++ 11方法,同时等待套接字和bool变量
- c++静态bool变量
- 我不断收到一个错误:"no operator >> matches thees operands" int 和 bool 变量。在>>运算符过载
- 将整数值存储在bool变量中