C ++静态bool变量

时间:2014-03-26 15:11:05

标签: c++ class static members

我无法理解导致我遇到的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中定义”

2 个答案:

答案 0 :(得分:3)

包含防护(#ifndef和#pragma)并不能在编译单元之间工作,这是你永远不应该在头文件中定义任何内容的原因之一,只能声明它们。当然除了模板。

编译单元是一个.cpp文件和所有包含的标头。每个.cpp创建一个包含代码的中间阶段二进制表示的目标文件,这是编译阶段。然后在链接阶段将这些目标文件链接在一起。因为每个.cpp都是用c ++单独处理的,如果你有" float foo;"在header.hpp中,a.cp​​p和b.cpp都包含header.hpp,编译器在运行应用程序时如何知道你的意思?

答案 1 :(得分:1)

A"静态"类声明中的变量实际上是该类范围内的extern变量的声明。与每个外部变量一样,它需要恰好一个源文件中的定义。否则,链接器会抱怨它。

您可能包含来自多个源文件的.h文件,因此您有多个定义。