C++ 在命名空间c++;

C++ 在命名空间c++;,c++,c++03,C++,C++03,我有一些常量变量,我希望的值在多个源文件之间共享。我还希望将变量的作用域限制在名称空间内。我不确定这样做的最佳/正确方法 我可以使用#define,但希望使用类型安全性 到目前为止,我有以下有效方法: File0.h #pragma once namespace Namespace1 { extern const int variable1; extern const int variable2; } File0.cpp const int Namespace1::variabl

我有一些常量变量,我希望的值在多个源文件之间共享。我还希望将变量的作用域限制在名称空间内。我不确定这样做的最佳/正确方法

我可以使用#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如何知道值何时已初始化

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

你没有。这就是我们所知道的。不同转换单元中命名空间范围静态对象的初始化是按未指定的顺序进行的。如果一个静态对象的初始化依赖于不同转换中的另一个对象,则该行为是未定义的

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

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

这将不是一个定义规则违反,因为C++标准(即使在2003)允许这样的积分常数通过多个翻译单位来定义,使它们隐含地具有内部链接。它们也是常量表达式,就像宏生成的一样

命名空间作用域常量变量是隐式静态的,因此与原始代码段不完全等效。@PasserBy-我希望它不是等效的。原始代码段可能会被初始化顺序破坏。我的意思是它们具有不同的语义,同时避免了失败。既然“命名空间范围常量变量是隐式静态的”,这是否意味着以下内容是等效的
namespace Namespace1{const int variable1=10;}
namespace Namespace1{static const int variable1=10;}
@phön-是的,这是一个难点,类似于。。。但我仍然认为这样的代码在实践中不太可能出现。无论如何,这还不足以保证进一步扩展答案。