std::array 中使用的 C++ 11 中的全局常量
Global constant in C++ 11 used in std::array
基本上我想在另一个文件中使用 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/source 方法时,我不能直接交叉引用全局变量,至少对于 std::array。
我读了一些类似的链接,但是 none 已经提到了这一点(也许我的搜索不走运)。
http://www.learncpp.com/cpp-tutorial/42-global-variables/
那么解决方法是什么?
与
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
常量;都具有相同的价值,但有很多副本。
这种情况下,可以在header里加上extern
extern const int nvegetation_type = <value>;
并且,仅在一个 cpp 文件中,添加
const int nvegetation_type;
感谢所有评论和回答。我想我已经在你的帮助下修复了它。
请原谅我一开始没有提供足够的细节。我没有对我遇到的问题进行更简单的演示。通常我会创建一个测试项目。
所以最终的解决方案是混合的。
如上所述,std::array 需要在编译阶段知道常量值。我的post中提到的方法5是最理想的解决方案。在这种情况下,只需要一个头文件。它将在 std::array 中使用。这种方法的缺点是它会创建多个头文件副本。
对于其他全局变量,可以使用方法6,经典的头文件和源文件来定义。
所以我把全局变量分为两类,分别用方法5和方法6来定义。它奏效了!
基本上我想在另一个文件中使用 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/source 方法时,我不能直接交叉引用全局变量,至少对于 std::array。 我读了一些类似的链接,但是 none 已经提到了这一点(也许我的搜索不走运)。 http://www.learncpp.com/cpp-tutorial/42-global-variables/ 那么解决方法是什么?
与
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
常量;都具有相同的价值,但有很多副本。
这种情况下,可以在header里加上extern
extern const int nvegetation_type = <value>;
并且,仅在一个 cpp 文件中,添加
const int nvegetation_type;
感谢所有评论和回答。我想我已经在你的帮助下修复了它。
请原谅我一开始没有提供足够的细节。我没有对我遇到的问题进行更简单的演示。通常我会创建一个测试项目。
所以最终的解决方案是混合的。 如上所述,std::array 需要在编译阶段知道常量值。我的post中提到的方法5是最理想的解决方案。在这种情况下,只需要一个头文件。它将在 std::array 中使用。这种方法的缺点是它会创建多个头文件副本。
对于其他全局变量,可以使用方法6,经典的头文件和源文件来定义。
所以我把全局变量分为两类,分别用方法5和方法6来定义。它奏效了!