基本上我想在另一个文件中使用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来定义它们。这招奏效了!