首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在std::C++ 11中使用的全局常数

问在std::C++ 11中使用的全局常数
EN

Stack Overflow用户
提问于 2016-09-27 18:30:47
回答 2查看 1.5K关注 0票数 1

基本上,我希望在另一个文件中使用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中的其他源文件中定义数组时,

代码语言:javascript
复制
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} };

我会收到这样的错误:

代码语言:javascript
复制
 error C2065: 'nvegetation_type': undeclared identifier.

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-27 20:00:09

谢谢你的评论和回答。我想我已经用你的帮助修好了。

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

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2016-09-27 18:39:43

使用

代码语言:javascript
复制
extern const int nvegetation_type;

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

在编译阶段,编译器必须知道常量的确切值,以便执行以下指令

代码语言:javascript
复制
const std::array< double, nvegetation_type > some_variable 

所以这个错误。

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

代码语言:javascript
复制
const int nvegetation_type = <value>;

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

缺点是,如果您在许多cpp文件中包含了这个头,那么您的程序就定义了许多nvegetation_type常量;它们都具有相同的值,但是有很多副本。

在本例中,可以在标头中添加extern。

代码语言:javascript
复制
extern const int nvegetation_type = <value>;

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

代码语言:javascript
复制
const int nvegetation_type;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39731917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档