存储一个必须被多个源文件读取但只能在运行时知道的值的最佳方法是什么

2022-01-30 08:56:51 标签 c++

我有一个函数,当程序启动时运行,并初始化程序需要的所有变量,但只能在运行时获得。这些变量必须由多个源文件读取。

存储这些值的最佳方法是什么?

其中一个变量是到本地Appdata目录的文件路径。我不知道运行这个函数来获得这个路径是多么昂贵,所以我只想获得它一次,并存储它,供程序以后使用。

我已经尝试使用const std::string,但由于(据我所知)一个常量不能在运行时初始化,该选项不工作。当然,我可以只使用全局变量,但这似乎不是一个很好的实践。此外,如果变量被意外地编辑了,这可能会导致问题(为了找到一行代码,我已经调试了几个小时)。

我知道c#提供了静态只读,这对我来说是完美的,所以我感兴趣的是,如果有类似的东西存在于c++中,或者如果有一个替代解决方案比使用非常量全局变量更好。

###使用函数局部静态变量。它将在第一次使用时初始化。

const std::string &GetAppDataPath()
{
    static const std::string ret = /*do stuff here*/;
    return ret;
}

全局变量(在程序启动时初始化)的性能较差,因为在它初始化之前(从不同的全局变量的初始化器)可能会意外地访问它。

注意,你必须在初始化器中做所有的事情。例如,这是错误的:

const std:: string &GetAppDataPath ()

? static const std::string ret;

? ActuallyGetAppDataPath(&ret);

? return ret;

如果你不能将所有内容直接放入初始化器中,请使用一个立即调用的lambda:

const std::string &GetAppDataPath()
{
    static const std::string ret = []{
        std::string ret;
        ActuallyGetAppDataPath(&ret);
        return ret;
    }();
    return ret;
}

###让静态工作为你这样:

#include <filesystem>
#include <iostream>
#include <string>
const std::string& get_app_data_folder()
{
    // current_path is a stand in for your getting path to %Appdata% 
    // static means initialized only once at first call to get_app_data_folder
    static std::string path{ std::filesystem::current_path().string() }; 
    return path;
}
int main()
{
    auto path = get_app_data_folder();
    std::cout << path << std::endl;
    return 0;
}
阅读全文

▼ 版权说明

相关文章也很精彩
推荐内容
更多标签
相关热门
全站排行
随便看看

错说 cuoshuo.com —— 程序员的报错记录

部分内容根据CC版权协议转载;网站内容仅供参考,生产环境使用务必查阅官方文档

辽ICP备19011660号-5

×

扫码关注公众号:职场神器
发送: 1
获取永久解锁本站全部文章的验证码