gpt4 book ai didi

c++ - std::array 中使用的 C++ 11 中的全局常量

转载 作者:行者123 更新时间:2023-11-30 03:38:13 33 4
gpt4 key购买 nike

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

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

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

最佳答案

extern const int nvegetation_type;

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

并且编译器必须知道常量的确切值,在编译阶段,对于后面的指令

const std::array< double, nvegetation_type > some_variable 

所以错误。

一个简单的解决方案是使用头文件,您可以在其中声明常量及其值。

const int nvegetation_type = <value>;

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

缺点是,如果你在很多cpp文件中包含这个头文件,你的程序会定义很多nvegetation_type常量;都具有相同的值(value),但有很多拷贝。

在这种情况下,你可以在header中添加extern

extern const int nvegetation_type = <value>;

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

const int nvegetation_type;

关于c++ - std::array 中使用的 C++ 11 中的全局常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39731917/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com