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

时间:2018-09-12 07:15:38

标签: c++ c++03

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

我可以使用#define,但要具有类型安全性。

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

File0.h

#pragma once

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

File0.cpp

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

Source1.cpp

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

Source2.cpp

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

使用extern怎么知道值何时初始化?

1 个答案:

答案 0 :(得分:7)

  

使用extern怎么知道值何时初始化?

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

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

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

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