基本上,我希望在另一个文件中使用std::array中的全局常量。
我知道这个全局变量问题已经在这里被问了很多次了。例如,这个:Defining global constant in C++
就我个人而言,我更喜欢使用方法5或6:
5: const GLOBAL_CONST_VAR = 0xFF;
6: extern GLOBAL_CONST_VAR;在一个源文件中,const GLOBAL_CONST_VAR = 0xFF;
我的项目需要很多常数,比如太阳常数。还有一些用于std::array,例如,nvegetation_type、nrock_type。
我以前使用方法5,所以所有其他源文件只使用一个头。但出现的多个定义问题类似于:Multiple definition and header-only libraries和here:Why aren't my include guards preventing recursive inclusion and multiple symbol definitions?
但是,在我的Visual 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/,那么解决方案是什么呢?
发布于 2016-09-27 20:00:09
谢谢你的评论和回答。我想我已经用你的帮助修好了。
请原谅我一开始没有提供足够的细节。我没有简单地演示我遇到的问题。通常我会创建一个测试项目。
因此,最终的解决方案是一个混合方案。如上所述,std::数组需要在编译阶段知道常量值。我在文章中提到的方法5是理想的解决方案。在这种情况下,只需要一个头文件。它将用于std::array。这种方法的缺点是它将创建头文件的多个副本。
对于其他全局变量,可以使用方法6 (经典的头文件和源文件)定义它们。
因此,我将全局变量分为两类,分别使用方法5和方法6来定义它们。而且起作用了!
发布于 2016-09-27 18:39:43
使用
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;https://stackoverflow.com/questions/39731917
复制相似问题