c++ 11中的全局常量,用于std::array
Global constant in C++ 11 used in std::array
基本上我想在另一个文件中使用std::数组中的全局常量。
我知道全局变量的问题已经被问了很多次了。例如,这个:在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,因此所有其他源文件只使用一个头文件。但是多重定义的问题类似于:多个定义和仅头文件库在这里:为什么我的include保护不能防止递归包含和多个符号定义?
但这在我的Visual Studio c++项目中看起来不是问题,我还不知道为什么。我在Linux下使用了makefile,它也编译了。
然而,当我在c++ 11中使用方法6并在其他源头文件中定义数组为
时,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/那么解决方案是什么呢?
With
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;
感谢所有的评论和回答。我想在你的帮助下我已经修好了。
请原谅我一开始没有提供足够的细节。对于我遇到的问题,我没有给出更简单的说明。通常我会创建一个测试项目。
所以最终的溶液是混合的。如上所述,std::数组要求在编译阶段知道常量值。我在文章中提到的方法是理想的解决方案。在这种情况下,只需要一个头文件。它将在std::array中使用。这种方法的缺点是它将创建头文件的多个副本。
对于其他全局变量,可以使用方法6、经典头文件和源文件来定义。
因此,我将全局变量分为两类,并分别使用方法5和6来定义它们。这招奏效了!
- 专用于 std 元组的模板,而无需用户执行remove_cvref
- 使用 std::应用于 std::bind
- 运算符 += 应用于 std::valarray<int*>
- 为什么这个分配器不适用于"std::allocate_shared"?奇怪的模板替换错误
- 隐式转换为比较函数对象(函子)用于 std::sort 而不是 std::map?
- C++11 基于范围的 for 循环,用于 std::list
- 函数可以应用于 std::optional,并返回一个可选值吗?
- 为什么基于 int 的访问不适用于 std::get(std::tuple)?
- Hana BOOST _Hana_DEFINE_STRUCT不适用于std::unique_ptr
- 模板推导不适用于 std::endl?
- 结构化绑定是否适用于 std::vector?
- 没有适用于 std::unique_ptr 的适当默认构造函数
- 适用于 std::unique_ptr 的内存高效自定义删除器?
- 如何为专用于 std::enable_if 的类定义类外函数
- C++类运算符重载不适用于 std::sort
- 我可以将Brad-Init-list用于STD ::变体的向量吗?
- 为什么不区分大小写适用于 std::unordered_set的 std::hash 函数?
- 用于 std::generate_n 的并行执行可变 lambda 生成器
- 为什么 lambda 函数不适用于 std::min_element?
- 如何将 lambda 用于 std::find_if