gpt4 book ai didi

c++ - 管理命令行参数

转载 作者:太空狗 更新时间:2023-10-29 20:59:15 25 4
gpt4 key购买 nike

致力于更新一些旧代码,原作者决定所有命令行参数变量都应该是全局变量。从测试和开发的角度来看,这显然使事情变得更具挑战性。

我的问题是如何最好地管理所有类都需要使用的命令行参数(例如跟踪标志/调试标志)。一位同事建议至少将变量包装在命名空间中,但这似乎还不够。我想到了一个单例或静态类,只是提供 setter/getter ,但这似乎不太优雅。另一方面,这似乎比必须将 5 个配置选项传递给每个需要知道是否设置了调试和其他一些选项的类要好。

最佳答案

全局变量的最大问题是,从函数内部更改它们往往会产生意想不到的副作用,从而引入错误。然而,在命令行参数的情况下,就正在运行的进程而言,它们本质上是常量。唯一阻止您将它们声明为 const 的是,它们需要在您开始解析命令行时分配。

我建议创建一些机制,允许您在开始时初始化参数,然后防止程序的任何部分更改它们。这将有效避免全局变量通常会引入的任何缺点。

一种方法可能是 ProgramArguments 类/结构,其中包含在构造函数中初始化的 const 成员,方法是解析命令行。然后你可以有类似的东西:

std::unique_ptr<ProgramArguments const> g_program_arguments;

int main(int argc, char* argv[])
{
g_program_arguments.reset(new ProgramArguments(argc, argv));
if(g_program_arguments->verbose)
std::cout << "verbose!" << std::endl;
// ...
return 0;
}

但这不会阻止您更改指针以指向不同的 ProgramArguments 实例。另一种方法可能是为了初始化目的暂时放弃常量:

struct ProgramArguments {
ProgramArguments() {}
bool verbose;
};

ProgramArguments const g_program_arguments;

void init_program_arguments(int argc, char* argv[])
{
ProgramArguments& program_arguments = const_cast<ProgramArguments&>(g_program_arguments);
program_arguments.verbose = true;
}

int main(int argc, char* argv[])
{
init_program_arguments(argc, argv);
if(g_program_arguments.verbose)
std::cout << "verbose!" << std::endl;
return 0;
}

关于c++ - 管理命令行参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25022875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com