c++静态bool变量

C++ static bool variable

本文关键字:变量 bool 静态 c++      更新时间:2023-10-16

我无法理解导致我遇到的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文件,因此您有多个定义。