在命名空间c ++中正确声明extern变量

Ale*_*ell 4 c++ c++03

我有一些const变量,我希望在多个源文件之间共享值.我还希望变量的范围限于命名空间.我不确定最好/正确的方法吗?

我可以使用#define但希望类型安全.

到目前为止,我有以下工作:

File0.h

#pragma once

namespace Namespace1
{
   extern const int variable1;
   extern const int variable2;
}
Run Code Online (Sandbox Code Playgroud)

File0.cpp

const int Namespace1::variable1 = 10;
const int Namespace1::variable2 = 10;
Run Code Online (Sandbox Code Playgroud)

Source1.cpp

#include "File0.h"
int result1 = Namespace1::variable1 + Namespace1::variable2;
Run Code Online (Sandbox Code Playgroud)

Source2.cpp

#include "File0.h"
const int result2 = Namespace1::variable1 + Namespace1::variable2;
Run Code Online (Sandbox Code Playgroud)

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

Sto*_*ica 7

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

你没有.这被称为静态初始化顺序fiasco.在不同的翻译单元中初始化命名空间范围静态对象是以未指定的顺序完成的.如果一个静态对象依赖于另一个转换中的另一个对象进行初始化,则该行为是未定义的.

即使使用简单的整数,也可能发生这种灾难.由于您的目的是避免宏(一个有价值的目标),您可以在标头中定义这些常量:

namespace Namespace1
{
    const int variable1 = 10;
    const int variable2 = 10;
}
Run Code Online (Sandbox Code Playgroud)

这不会违反单定义规则,因为C++标准(即使在2003年)允许通过使它们隐式地具有内部链接来在多个转换单元中定义这样的积分常量.它们也是常量表达式,就像宏会产生的一样.