std::array 中使用的 C++ 11 中的全局常量

Global constant in C++ 11 used in std::array

基本上我想在另一个文件中使用 std::array 中的全局常量。

我知道这里已经多次问到全局变量问题。例如这个: Defining global constant in C++

我个人更喜欢使用方法 5 或 6:

5: const int GLOBAL_CONST_VAR = 0xFF;

6: extern const int GLOBAL_CONST_VAR;在一个源文件中 const int GLOBAL_CONST_VAR = 0xFF;

我的项目需要很多常数,比如太阳常数。还有一些用于std::array,例如nvegetation_type,nrock_type。

我以前用的是方法5,所以所有其他源文件只用一个header。但是出现的多重定义问题类似于: Multiple definition and header-only libraries 和这里: Why aren't my include guards preventing recursive inclusion and multiple symbol definitions?

但这在我的 Visual Studio C++ 项目中似乎不是问题,我还不知道为什么。我在Linux下使用了makefile,它也编译了。

然而,当我使用方法 6 并在 C++11 的其他源头文件中定义数组时

extern const int nvegetation_type ;
const std::array< double, nvegetation_type > some_variable
 = { { 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 
       0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1} };

我会收到如下错误:

 error C2065: 'nvegetation_type': undeclared identifier.

我假设当我使用 header/source 方法时,我不能直接交叉引用全局变量,至少对于 std::array。 我读了一些类似的链接,但是 none 已经提到了这一点(也许我的搜索不走运)。 http://www.learncpp.com/cpp-tutorial/42-global-variables/ 那么解决方法是什么?

extern const int nvegetation_type;

你是在对编译器说,在某处定义了一个常量但是编译器在编译阶段不知道这个值。

并且编译器必须知道常量的确切值,在编译阶段,用于以下指令

const std::array< double, nvegetation_type > some_variable 

所以错误。

一个简单的解决方案是使用一个头文件,您可以在其中声明 const 及其值。

const int nvegetation_type = <value>;

(甚至 constexpr,考虑到您已将问题标记为 c++11)并将其包含在每个需要的 cpp/h 文件中。

缺点是,如果你在很多cpp文件中包含这个头文件,你的程序会定义很多nvegetation_type常量;都具有相同的价值,但有很多副本。

这种情况下,可以在header里加上extern

extern const int nvegetation_type = <value>;

并且,仅在一个 cpp 文件中,添加

const int nvegetation_type;

感谢所有评论和回答。我想我已经在你的帮助下修复了它。

请原谅我一开始没有提供足够的细节。我没有对我遇到的问题进行更简单的演示。通常我会创建一个测试项目。

所以最终的解决方案是混合的。 如上所述,std::array 需要在编译阶段知道常量值。我的post中提到的方法5是最理想的解决方案。在这种情况下,只需要一个头文件。它将在 std::array 中使用。这种方法的缺点是它会创建多个头文件副本。

对于其他全局变量,可以使用方法6,经典的头文件和源文件来定义。

所以我把全局变量分为两类,分别用方法5和方法6来定义。它奏效了!