【问题标题】:What is the best way to include a "help" message in a console application?在控制台应用程序中包含“帮助”消息的最佳方式是什么?
【发布时间】:2011-08-26 09:06:41
【问题描述】:

我正在编写一个控制台应用程序,它正在迅速获得许多命令行参数和标志。出于这个原因,我希望用户能够访问这些标志的描述以及它们的用途。

我能想到几种可能的解决方案

  • 我可以编写一个 README 文件并将其粘贴到可执行文件所在的同一目录中。优点是简单且可移植,但缺点是有人很容易删除/编辑文件。
  • 当用户输入mycmd --help 或类似的东西时,我可以将整个消息粘贴到我的程序中的一个变量中并将其打印到屏幕上。优点,保留可执行且不可编辑,缺点在于代码,因为我会在下面浮动类似的东西。

    const char[] helpmsg = "Line1\n"
                           "Line2\n"
                           "...\n"
                           "LineN\n";
    
  • 我可以为我的程序编写一个 man 条目,但这不是很便携,因为该应用程序在 Windows 和 Linux 上的使用几乎相同。

我知道这个问题可能是一个口味问题,但我只是好奇是否还有其他我没有想到的人们过去使用过的解决方案。

理想情况下,开发人员(目前是我)可以轻松编辑和保持更新,但其他人无法真正弄乱它。

【问题讨论】:

  • @Filip Ekberg 坏主意,这会重复信息,这绝不是一件好事,这将总是导致它们之间的差异。
  • 你应该为 c++ 或 c 提问。

标签: c++ c console usage-message


【解决方案1】:

考虑使用boost program options 库。

【讨论】:

  • 这看起来像我所追求的。我看到您可以将选项和描述添加到预期的输入中。从文档中不太清楚我将如何将这些打印到屏幕上,但我认为它必须是可能的,否则为每个选项提供描述的意义何在。
  • 参见tutorial,“入门”部分。你可以直接输出 boost::program_options::options_description 对象。
【解决方案2】:

为了打印帮助信息,我通常为此使用一个函数。因此,您可以在启动时或运行时使用它。例如:

void usage(char* progName)
{
  cout << progName << "[options]" << endl <<
      "Options:" << endl <<
      "-h | --help        Print this help" << endl <<
      "-v | --version     Print the SVN version" << endl <<
      "-V | --Version     Print the proxy version" << endl <<
      "-d | --daemonize   Run as daemon" << endl <<
      "-P | --pidfile     Path to PID file (default: " <<
        WPASUP_PROXY_DEFAULT_PID_FILE << ")" << endl <<
      "-l | --logging     Path to logging file (default: " <<
        WPASUP_PROXY_DEFAULT_LOGGING << ")" << endl <<
      "-i | --ip          The IP address of the main application (default: " <<
        WPASUP_PROXY_MAIN_APP_IP << ")" << endl <<
      "-p | --port        The port number of the main application (default: " <<
        WPASUP_PROXY_DEFAULT_MAIN_APP_PORT << ")" << endl <<
      "-w | --wpa_cli     Path to wpa_cli program (default: " <<
        WPASUP_PROXY_DEFAULT_WPA_CLI << ")" << endl;
}

如果您愿意,也可以使用 printf 函数……我认为这是一种常见的做法,但如果有人有更好的想法,我会很感兴趣!

问候!

【讨论】:

  • std::cout 对于示例 sn-p 会更好。为什么使用std::endl?它在每一行之后刷新缓冲区。我会使用\n。 (没有批评,真正的问题)
【解决方案3】:

您也可以编写一个 README 并在 prog --help 上将其打印到控制台。

【讨论】:

    【解决方案4】:

    您可以使用getopt C library,其目标正是允许解析和使用多个选项(短格式或长格式)。

    (注意还有一个getopts 程序可以与具有类似功能的shell 脚本一起使用)

    【讨论】:

      猜你喜欢
      • 2018-10-09
      • 1970-01-01
      • 1970-01-01
      • 2018-06-14
      • 2011-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多