2016-09-27 89 views
1

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

我知道这个全局变量问题已经在这里被多次询问了。例如,这样一句: 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,所以只有一个头用于所有其他源文件。但多个定义问题出现类似于: 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. 

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

+0

我不知道你在问什么。 –

+0

我会想这个错误是'未定义的标识符'而不是'未声明的标识符'? – lfgtm

+0

它确实看起来像一个奇怪的诊断(即使问题不是联系,所以你建议的选择不太对) –

回答

1

感谢所有的意见和解答。我想我已经用你的帮助修复了它。

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

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

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

因此,我将全局变量分为两类,分别使用方法5和6来定义它们。它的工作!

1

随着

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 const int nvegetation_type = <value>; 

添加extern和,只在一个CPP文件,添加

const int nvegetation_type; 
+0

那么解决方案是什么? – Chang

+0

@长寮 - 答案改进 – max66

+0

谢谢,这是一个非常明确的解释。但是,当我测试最后一部分时,事实证明 在这种情况下,您可以在标头中添加extern extern const int nvegetation_type = ; ,并且只在一个cpp文件中添加 const int nvegetation_type; 将导致多重定义问题,所以我删除.cpp文件,它的工作。 @ max66 – Chang