如何使用函数值初始化命名空间中的全局常量变量?
How to initialize global const variables in a namespace with values from a function?
我正在从 XML 文件中读取应用程序的一堆 'settings',我希望这些设置驻留在命名空间中,以便我的所有函数都能够访问。通过将 header 中的命名空间变量声明为 'extern int test;',然后在源文件 'int test{0};' 中初始化它们,我成功地完成了这项工作。然后在源文件中有一个函数读取 XML 并将值分配给命名空间变量,一切都很好。
问题是我意识到我正在创建 ~100 read/writeable 个全局变量,而它们只需要保持不变。所以我现在正在尝试更改我的代码,因为它们是不变的,但我不知道这怎么可能。这是我尝试过的:
//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 之外,我也必须移动临时变量,但即使这样也没有关系,因为我只需要在函数执行后初始化名称空间变量。我正在尝试做的事情是否可行?
为了设置常量全局变量,需要在定义的时候设置。所以这样做:
const int ktest = getValueofKtest();
此外,设置一百个变量是维护的噩梦。使用设置 class.
在头文件中声明一个函数原型,然后声明您的命名空间,并根据其 return 初始化外部常量。然后在 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
}
好的,我不确定这是否是 raindrop 的目的,但它启发了我找到这个解决方案。这是我的结构:
//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.c 文件开始时调用它。现在这个函数实际上在程序启动时立即运行,甚至在 main 启动之前并分配所有这些占位符变量,所以当其他变量被初始化时,函数已经 运行.
现在我承认,我所做的似乎有点捷径,但它确实有效,现在我有一个名称空间,其中包含 100 个在运行时初始化的全局 const 变量,通过包含头文件。这是合法的,或者更确切地说,这是比仅拥有 100 个可变全局变量更好的做法吗?
我正在从 XML 文件中读取应用程序的一堆 'settings',我希望这些设置驻留在命名空间中,以便我的所有函数都能够访问。通过将 header 中的命名空间变量声明为 'extern int test;',然后在源文件 'int test{0};' 中初始化它们,我成功地完成了这项工作。然后在源文件中有一个函数读取 XML 并将值分配给命名空间变量,一切都很好。
问题是我意识到我正在创建 ~100 read/writeable 个全局变量,而它们只需要保持不变。所以我现在正在尝试更改我的代码,因为它们是不变的,但我不知道这怎么可能。这是我尝试过的:
//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 之外,我也必须移动临时变量,但即使这样也没有关系,因为我只需要在函数执行后初始化名称空间变量。我正在尝试做的事情是否可行?
为了设置常量全局变量,需要在定义的时候设置。所以这样做:
const int ktest = getValueofKtest();
此外,设置一百个变量是维护的噩梦。使用设置 class.
在头文件中声明一个函数原型,然后声明您的命名空间,并根据其 return 初始化外部常量。然后在 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
}
好的,我不确定这是否是 raindrop 的目的,但它启发了我找到这个解决方案。这是我的结构:
//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.c 文件开始时调用它。现在这个函数实际上在程序启动时立即运行,甚至在 main 启动之前并分配所有这些占位符变量,所以当其他变量被初始化时,函数已经 运行.
现在我承认,我所做的似乎有点捷径,但它确实有效,现在我有一个名称空间,其中包含 100 个在运行时初始化的全局 const 变量,通过包含头文件。这是合法的,或者更确切地说,这是比仅拥有 100 个可变全局变量更好的做法吗?