如何用函数的值初始化命名空间中的全局const变量
How to initialize global const variables in a namespace with values from a function?
我正在从XML文件中读取一堆应用程序的"设置",我希望这些设置驻留在我所有功能的命名空间中,以便能够访问。通过在头文件中将命名空间变量声明为'extern int test;',然后在源文件'int test{0};'中对它们进行初始化,我已经成功地完成了这项工作。然后在源文件中有一个函数读取XML并将值分配给命名空间变量,一切都很顺利。
问题是我意识到我正在创建~100个可读/可写的全局变量,当他们只需要是常数。所以我现在试着改变我的代码,因为它们是恒定的,我不知道这怎么可能。下面是我的尝试:
//settings.hpp
#pragma once
//header guard
namespace settings {
extern const int ktest;
}
//settings.cpp
void ReadXML() {
int testvalue{1}; //1 is default values
//here would be some code that gets value form XML and assigns it to testvalue
namespace settings {
const int ktest{testvalue};
}
}
现在的问题是我不能把名称空间值放在函数内。因此,如果我将它们移到ReadXML函数之外,我也必须移动临时变量,但即使这样也没关系,因为我只需要在函数执行之后初始化名称空间变量。我想做的事情可能吗?
在头文件中声明一个函数原型,然后你的命名空间,并根据它的返回值初始化extern常量。然后在main中定义函数:
//header.hpp
#pragma once
int RetValue(); // prototype
namespace A{
extern const int value(RetValue());
}
//source.cpp
int RetValue(){return 7;} // defining retValue
int main()
{
cout << A::value << endl; // output: 7
}
好吧,我不确定这是不是雨滴的意思,但它启发了我找到这个解决方案。这是我的结构:
//xmlreader.hpp
#pragma once
//header guard
int ReadXML();
namespace settings {
extern const int kreadsucces; //Has to be first, is result of read function
extern const int ktest;
}
//xmlreader.cpp
#include "xmlreader.hpp"
static int test {0}; //Default in case of exception in read function
int ReadXML() {
//xml read code here, assign new 'test' value if successful
test = 2;
return 1;
}
namespace settings {
const int kreadsucces{ReadXML()}; //ReadXML is executed before main now!
const int ktest{test};
}
//main.cpp
#include "xmlreader.hpp"
// if (ReadXML() > 0) {} //Was old code, now called at initialization
if (settings::kreadsuccess > 0) {
std::cout << "XML read succesful" << std::endl;
} else {
std::cout << "XML read failed, using defaults" << std::endl;
}
std::cout << settings::ktest << std::endl; //Prints 2
我所做的是添加'settings::readsuccess'变量并初始化它与我的函数,而不是在我的main开始时调用它。现在,这个函数实际上在程序启动时立即运行,甚至在main启动之前,并分配所有这些占位符变量,所以当其他变量初始化时,函数已经运行了。
现在我承认,我所做的看起来有点快捷,但它工作了,现在我有了一个充满100个全局const变量的命名空间,这些变量在运行时初始化,可以通过包括头文件在程序的其他地方访问。这是合法的,或者更好地说,这是一个更好的做法,而不是仅仅有100个可变的全局变量?
为了设置一个常量全局变量,您需要在定义它时设置它。所以这样做:
const int ktest = getValueofKtest();
另外,设置100个变量是一场维护噩梦。使用设置类
- 有什么陷阱用 constexpr string_view 替换全局 const char[]?
- 不可变的全局对象应该声明为"const my_result_t BLAH"还是"extern const my_result_t BLAH;"?
- 定义,初始化全局const变量是安全的吗?
- 为什么全局定义"const Date default_date(1970,1,1);"不好?
- 在头文件中声明全局 const 对象
- 使用帮助程序函数 (c++) 定义运行时已知的全局 const 变量
- 如何在另一个类中使用来自主类的全局const int变量
- const强制转换为全局变量,程序崩溃(c++)
- 全局const变量的g++名称混淆
- 静态const全局函函数实例
- 使用静态/全局const原语的计算是否发生在编译时
- 全局分配函数和const void*
- c++中全局const变量的正确使用
- 如何用函数的值初始化命名空间中的全局const变量
- Make函数将全局变量视为const
- 全局函数模板重载和const形参
- 如何保护具有非const方法的全局对象
- 使用static、const、constexpr的全局声明/初始化
- C++中静态Const和Const变量在全局和类中的行为
- 在 c++ 中声明一个全局范围变量 const