在命名空间 C++ 中正确声明外部变量
Correctly declaring extern variable in a namespace c++
我有一些 const 变量,我希望它们的值在多个源文件之间共享。我还希望将变量的范围限制在命名空间内。我不确定 best/correct 执行此操作的方法?
我可以使用#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 我如何知道值何时已初始化?
With extern how do I know when the value has been initialized?
你不知道。即所谓的static initialization order fiasco。不同翻译单元中命名空间作用域 static objects 的初始化以未指定的顺序完成。如果一个静态 object 依赖于另一个 object 以不同的翻译进行初始化,则行为未定义。
即使是简单的整数,也可能会发生这种灾难。由于您的意图是避免宏(一个有价值的目标),您可以在 header:
中定义这些常量
namespace Namespace1
{
const int variable1 = 10;
const int variable2 = 10;
}
这不会违反 one-definition-rule,因为 C++ 标准(甚至在 2003 年)允许通过使它们隐式具有内部链接来在多个翻译单元中定义此类整数常量。它们也是常量表达式,就像宏会产生一样。
我有一些 const 变量,我希望它们的值在多个源文件之间共享。我还希望将变量的范围限制在命名空间内。我不确定 best/correct 执行此操作的方法?
我可以使用#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 我如何知道值何时已初始化?
With extern how do I know when the value has been initialized?
你不知道。即所谓的static initialization order fiasco。不同翻译单元中命名空间作用域 static objects 的初始化以未指定的顺序完成。如果一个静态 object 依赖于另一个 object 以不同的翻译进行初始化,则行为未定义。
即使是简单的整数,也可能会发生这种灾难。由于您的意图是避免宏(一个有价值的目标),您可以在 header:
中定义这些常量namespace Namespace1
{
const int variable1 = 10;
const int variable2 = 10;
}
这不会违反 one-definition-rule,因为 C++ 标准(甚至在 2003 年)允许通过使它们隐式具有内部链接来在多个翻译单元中定义此类整数常量。它们也是常量表达式,就像宏会产生一样。