c++ 11中的全局常量,用于std::array

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

本文关键字:用于 std array 常量 全局 c++      更新时间:2023-10-16

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

我知道全局变量的问题已经被问了很多次了。例如,这个:在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,因此所有其他源文件只使用一个头文件。但是多重定义的问题类似于:多个定义和仅头文件库在这里:为什么我的include保护不能防止递归包含和多个符号定义?

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

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

时,
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.

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

With

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常数;都有相同的价值,但副本很多。

在这种情况下,您可以在标题

中添加extern
extern const int nvegetation_type = <value>;

,并且只在一个CPP文件中添加

const int nvegetation_type;

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

请原谅我一开始没有提供足够的细节。对于我遇到的问题,我没有给出更简单的说明。通常我会创建一个测试项目。

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

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

因此,我将全局变量分为两类,并分别使用方法5和6来定义它们。这招奏效了!