如何用函数的值初始化命名空间中的全局const变量

How to initialize global const variables in a namespace with values from a function?

本文关键字:全局 const 变量 命名空间 初始化 何用 函数      更新时间:2023-10-16

我正在从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个变量是一场维护噩梦。使用设置类