gpt4 book ai didi

c++ - 头文件中的 const 变量和静态初始化失败

转载 作者:IT老高 更新时间:2023-10-28 22:33:48 27 4
gpt4 key购买 nike

在阅读了很多关于静态变量初始化的问题后,我仍然不确定这如何适用于命名空间级别的 const 变量。

我在构建脚本生成的 header 文件 config.h 中有以下代码:

static const std::string path1 = "/xyz/abc";
static const std::string path2 = "/etc";

根据我阅读的内容,static 关键字不是必需的,甚至在此处已弃用。

我的问题:上面的代码是否容易出现静态初始化失败?

如果我在 header 文件 myclass.h 中有以下内容:

class MyClass
{
public:
MyClass(const std::string& str) : m_str(str) {}
std::string Get() const { return m_str; }

private:
std::string m_str;
}

const MyClass myclass1("test");

这会对静态初始化造成任何问题吗?

如果我理解正确,由于 const 变量具有内部链接,这两种情况都应该没有问题?

编辑:(由于 dribeas 的回答)

也许我应该提到我对以下用例感兴趣:

main.cpp中:

#include <config.h>
#include <myclass.h>

std::string anotherString(path1 + myclass1.Get());

int main()
{
...
}

关于这个用例的另一个问题:编译器会在这种情况下优化掉 path2 吗?

最佳答案

您的第一个定义将 path1 放置在包含 config.h 的每个编译单元中。为避免这种情况,请不要在头文件中定义变量。通常你会将 header 中的变量声明为 extern:

extern const std::string path1;
extern const MyClass myclass1;

并在翻译单元中定义它们,例如config.cpp:

const std::string path1 = "/xyz/abc";
const MyClass myclass1("test");

有时您需要一个只能在一个翻译单元中使用的常量变量。然后你可以在文件范围内将该变量声明为 static.

static const std::string path1 = "/xyz/abc";

static 不再被弃用。 staticextern 有时是隐含的,但我总是忘记在哪里以及如何使用,所以我通常为所有命名空间级变量显式指定它们。

关于c++ - 头文件中的 const 变量和静态初始化失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4806510/

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