c++ - 存储设置的最佳实践

标签 c++ visual-c++ settings

我有一个相当大的 C++ 应用程序(在 Windows 上,没有计划其他平台),它当前将所有设置(甚至是某种地址)存储在 Windows 注册表中。

有时这很不方便,因为用户很难更改注册表中的条目。我想对设置进行版本控制,以便设置始终与当前代码匹配。目前我们对 reg 文件进行版本控制,但您永远无法确定是否所有 reg 文件都已添加到目标机器上。使用 C#,您可以在 app.config 中定义默认值,但不要覆盖现有设置。我不知道 C++ 是否存在这样的机制或库。

我希望有以下“特征”:

  • 可以对设置进行版本控制
  • 目标机器上的简单更新(可由用户完成)
  • 确保更新时只添加新设置,没有现有设置被默认值覆盖
  • 用户设置的简单更改
  • Win XP 和 Win 7 下的相同工作流程

据我所知,在 Windows 上存储设置有 3 种可能性:

  • 注册表
  • 配置文件
  • XML文件

目前我们套件中只有一个应用程序使用 Qt,但 Boost 将可用。

对于地址,我们会将它们放在某种 XML 地址簿中,但对于其他设置我们不确定,最佳做法是什么。

最佳答案

正如评论中提到的,基于树的键/值结构是一种常见的解决方案,并且库很容易找到。

Boost's property_tree是一个很好的选择,因为它经过充分测试并且可以轻松导出为 XML 或 JSON

关于您的要求:

  • Settings can be versioned

是的!使“版本”成为顶级键。使其易于与其他版本进行比较。

您还可以将您的设置分类到各种树节点中,并为每个节点指定一个版本。

  • Simple update on target machines (can be done by user)

让您的应用程序在运行时执行此操作。见下文。

  • Ensure that on update only new settings are added and no existing settings are overwritten with default values
  • Simple change of settings for user
  • Same workflow under Win XP and Win 7

随着设置从一个版本更改为另一个版本,通常这些更改分为三类。需要新的属性,旧的设置被放弃,一些设置改变了它们的预期格式。例如。 “32华氏度”变成“0摄氏度”

当您的应用程序初始化时:

  • 加载现有配置文件,无论其版本如何。
  • 如果版本与应用程序的当前版本不匹配:
    • 为新配置创建一个新的空白属性树
    • 对于树中的每个节点,都有一组预期的属性名称,以及一个函数指针或类似的函数指针,如果它在旧文件的树中不存在,则可以获取此设置。如果设置更改了格式,请为其命名。
    • 在旧树中搜索每个设置,如果找到则复制它,如果没有找到则使用提供的函数的结果。
    • 保存您的新设置文件。

您的“缺失设置”功能可以:

  • 返回一个常量默认值。
  • 查询树的不同设置并转换它(如果旧设置也未找到,则使用默认值)
  • 询问用户

关于c++ - 存储设置的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11185131/

相关文章:

xcode - 如何在 Xcode 中更改 Git 的用户名?

c++ - COleSafeArray 与 CComSafeArray

c++ - 在 if-else if 链中使用 Likely()/Unlikely() 预处理器宏

.net - 为什么我的变量在 Debug 模式下被初始化,而在 Release 模式下却没有?

c++ - 'glPopMatrix':找不到标识符

Android:如何使用静态 IP 连接到接入点?

python - 如何从全局设置模块在 Django 中设置特定设置

c++ - AscW 等效于 C++ 中的 VB

c++ - 不理解 C++ STL 中 std::remove 的结果

c++ - Visual C++ 表达 2008 : Why does it places megs of null bytes at the end of the release executable?