gpt4 book ai didi

C++ 静态 bool 变量

转载 作者:搜寻专家 更新时间:2023-10-31 01:05:21 27 4
gpt4 key购买 nike

我无法理解导致我遇到的 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;
}

有人可以解释为什么即使我有 guard 也会发生这种情况吗?我还应该添加 #pragma once 吗?

提前致谢。

编辑:这是编译错误:"error LNK2005: "private: static bool GameManager::m_isGameOver"(?m_isGameOver@GameManager@@0_NA) 已经在 Execution.obj 中定义"

最佳答案

include guards(#ifndef 和#pragma)不能跨编译单元工作,这是你永远不应该在头文件中定义任何东西,只声明它们的原因之一。当然模板除外。

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

关于C++ 静态 bool 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22665228/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com