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

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 个可变全局变量更好的做法吗?