gpt4 book ai didi

c++ - 在命名空间 C++ 中正确声明外部变量

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:26:29 25 4
gpt4 key购买 nike

我有一些 const 变量,我希望它们的值在多个源文件之间共享。我还希望将变量的范围限制在命名空间内。我不确定执行此操作的最佳/正确方法?

我可以使用#define 但想要类型安全。

到目前为止,我有以下有效的方法:

文件0.h

#pragma once

namespace Namespace1
{
extern const int variable1;
extern const int variable2;
}

文件0.cpp

const int Namespace1::variable1 = 10;
const int Namespace1::variable2 = 10;

源1.cpp

#include "File0.h"
int result1 = Namespace1::variable1 + Namespace1::variable2;

Source2.cpp

#include "File0.h"
const int result2 = Namespace1::variable1 + Namespace1::variable2;

使用 extern 我如何知道值何时已初始化?

最佳答案

With extern how do I know when the value has been initialized?

你不知道。这就是所谓的 static initialization order fiasco .不同翻译单元中命名空间范围静态对象的初始化以未指定的顺序完成。如果一个静态对象的初始化依赖于不同翻译中的另一个对象,则该行为是未定义的。

即使是简单的整数,也可能会发生这种灾难。由于您的意图是避免使用宏(一个有值(value)的目标),因此您可以在 header 中定义这些常量:

namespace Namespace1
{
const int variable1 = 10;
const int variable2 = 10;
}

这不会违反单一定义规则,因为 C++ 标准(甚至在 2003 年)允许通过使它们隐式具有内部链接来在多个翻译单元中定义此类整数常量。它们也是常量表达式,就像宏会产生一样。

关于c++ - 在命名空间 C++ 中正确声明外部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52289491/

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