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

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

我正在尝试找出在我的程序中打印 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 'help' 消息后,我该怎么做才能退出我的程序?

  1. 我的函数不应该 returning std::string 而只是 return 一个错误代码吗?

  2. 是否应该抛出异常并在main中捕获然后退出?

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

提前致谢。

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

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

您可以调用以下函数:

std::exit( EXIT_FAILURE );

2。方法:
创建一个例外。

throw "Please call me with some parameters!"

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

我认为另一种更好的方法,根据这个post:C++ catching all exceptions

#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;
}

通过这种方式,您可以在错误上下文中管理所有程序执行并选择要执行的操作:更新 return 值、执行其他操作等。 你不会破坏你的主线程并阻止你在没有退出 exit() 函数的情况下记忆 errors/leaks。

1) eval (for 'exit value') 被 main context[= 实例化和销毁36=]。根据 main 的 return 值的类型,如果在退出程序时 return 之前发生错误,我们必须更改它的值。

2) 在我的示例中,我将 argv 发送到 checkHelp 函数,如果第一个参数 returned true我的软件(argv[1] 此处)等于 "-h""--help",如果不是 checkHelp returns false。您还可以对 main.

接收到的所有 argv 参数进行循环

3) 最后,catch (std::exception const &err) 允许您通过引用获取抛出的异常并打印其消息。因此,您正在完整地使用您的主要 try/catch 区块。