从函数打印 CLI 帮助消息后,我应该如何干净地退出 C++ 程序?

How should I exit a C++ program cleanly after printing the CLI help message from a function?

本文关键字:何干净 退出 C++ 程序 我应该 打印 函数 CLI 帮助 消息      更新时间:2023-10-16

我正在尝试找出在程序中打印 CLI 帮助信息后干净退出程序的最佳方法。目前看起来像这样。

int main(int argc, *char[] argv) {
try {
std::string settings_file = process_args(argc, argv);
do_more_stuff();
...
...
} catch (...) {
std::cerr << "Error" << std::endl;
return (EXIT_FAILURE)
}
}
std::string process_args(int argc, char *argv[]) {
boost::program_options::options_description desc("Program options");
desc.add_options()("help,h", "Print usage message")(
"settings,s", boost::program_options::value<std::string>(),
"Specify settings file");
boost::program_options::variables_map vm;
store(parse_command_line(argc, argv, desc), vm);
if (vm.count("help")) {
std::cout << desc << std::endl;
---->!!!!!!!! WHAT DO I DO HERE TO GET OUT !!!!!!!!<----
}
if (vm.count("settings")) {
std::cout << "Settings file " << vm["settings"].as<std::string() << std::endl;
return vm["settings"].as<std::string>();
} else {
throw std::runtime_error("Settings file must be specified.");
}
}

所以我的问题是在我打印 CLI "帮助"消息后,我该怎么做才能退出我的程序?

  1. 我的函数不应该返回 std::string 而只返回错误代码吗?

  2. 我应该抛出一个异常并在 main 中捕获它然后退出吗?

  3. 有没有更好/更好的方法?

提前谢谢。

根据这篇文章,我认为另一种更好的方法: C++捕获所有异常

#include <cstdlib>
#include <iostream>
#include <stdexcept>
static bool checkHelp(char * const argv[])
{
bool usage = (!strcmp(argv[1], "-h") or !strcmp(argv[1], "--help"));
if (usage) {
std::cout << "Print your usage" << std::endl;
}
return usage;
}
int main(int argc, char *argv[])
{
/* Set eval to default value */
int eval = EXIT_SUCCESS;
try {
if (!checkHelp(argv)) {
/*
** do some stuff here
*/
}
} catch (std::exception const &err) {
/* update eval on throwed exceptions */
eval = EXIT_FAILURE;
std::cerr << "error: " << err.what() << std::endl;
}
return eval;
}

通过这种方式,您可以在错误上下文中管理所有程序执行并选择要执行的操作:更新返回值,执行其他操作等。 您不会破坏主线程并防止您出现内存错误/泄漏,而无需通过exit()函数退出。

1)eval(对于"退出值")被实例化并在主上下文中销毁。根据 main 返回值的类型,如果发生错误,我们必须更改它的值,然后在退出程序时返回它。

2)在我的示例中,我将argv发送到checkHelp函数,如果我的软件(此处为argv[1])的第一个参数等于"-h"或"--help">,则返回true,如果不是checkHelp返回false。您还可以对 main 收到的所有 argv 参数执行循环。

3)最后,catch (std::exception const &err)允许您通过引用获取抛出的异常并打印他的消息。所以,你正在用你所有的诚信来尝试/捕捉块。

这是我个人的观点:没有最佳实践方法,但我更喜欢第一种方法!

1. 方法:
https://en.cppreference.com/w/cpp/utility/program/exit

您可以调用以下函数:

std::exit( EXIT_FAILURE );

2. 方法:
创建异常。

throw "Please call me with some parameters!"

但我不喜欢这种方法。对于某些用户,异常看起来像是存在内部软件错误...