【问题标题】:C++ Passing Options To ExecutableC++ 将选项传递给可执行文件
【发布时间】:2010-09-12 14:42:20
【问题描述】:

如何将选项传递给可执行文件?有没有比将 options 设为布尔参数更简单的方法?

编辑:最后两个答案建议使用参数。我知道我可以编写这样一个可行的解决方案,但我宁愿让它们成为选项。

EDIT2:根据澄清请求,我将使用这个简单的示例: 处理参数相当容易,因为它们会自动解析为数组。

./printfile file.txt 1000

如果我想知道用户想要打印的文件的名称,我可以通过 argv[1] 访问它。

现在说说这种情况:

./printfile file.txt 1000 --nolinebreaks

用户想要打印没有换行符的文件。这不是程序能够运行所必需的(因为要打印的文件名和行数),但是如果他/她愿意,用户可以选择使用。现在我可以使用:

./printfile file.txt 1000 true

使用提示会通知用户第三个参数用于确定是否打印带有换行符的文件。然而,这似乎相当笨拙。

【问题讨论】:

  • 您能详细说明一下吗?您在寻找:./a.out --arg1=2 --arg2=3,还是其他形式?

标签: c++ arguments


【解决方案1】:

命令行参数是要走的路。您可能需要考虑使用 Boost.ProgramOptions 来简化此任务。

【讨论】:

    【解决方案2】:

    您似乎认为以“--”开头的“选项”和不以“--”开头的“参数”之间存在一些根本区别。唯一的区别在于你如何解析它们。

    看看 GNU 的 getopt()/getopt_long() 选项解析器可能值得您花时间。它支持使用 --number-of-line-breaks 47 等选项传递参数。

    【讨论】:

    • 我不认为有什么根本区别,我只是知道有一种比使用布尔参数或寻找以 - 或 - 开头的参数更优雅的方式来处理它们。 getopt() 是我想要的。谢谢!
    【解决方案3】:

    我使用两种方法传递信息:

    1/ 使用命令行参数,使用 getargs 等特定库更容易处理。

    2/ 作为环境变量,使用getenv。

    【讨论】:

      【解决方案4】:

      Pax 的想法是正确的。

      如果您需要更彻底的双向通信,请使用管道打开进程并将内容发送到 stdin/listen on stdout。

      【讨论】:

        【解决方案5】:

        您也可以使用 Window 的 PostMessage() 函数。如果要将选项发送到的可执行文件已经在运行,这将非常方便。如果您对此技术感兴趣,我可以发布一些示例代码。

        【讨论】:

          【解决方案6】:

          这个问题对于上下文以及您正在尝试做的事情并不十分清楚 - 您的意思是从 C++ 程序中运行可执行文件?有几个标准 C 库函数,其名称如 execl()、execv()、execve() 等,它们将选项作为字符串或指向字符串数组的指针。还有 system() 接受一个字符串,其中包含您在 bash 提示符下输入的任何内容、选项和所有内容。

          【讨论】:

            【解决方案7】:

            我喜欢 popt 库。它是 C,但在 C++ 中也可以正常工作。

            但它似乎不是跨平台的。当我不得不为某些 Linux 软件的 Windows 端口破解我自己的 API 兼容版本时,我发现了这一点。

            【讨论】:

              【解决方案8】:

              您可以将选项放在 .ini 文件中并使用 GetPrivateProfileXXX API's 创建一个类,该类可以从 .ini 中读取您正在寻找的程序选项的类型。

              您还可以为您的应用创建交互式外壳,以实时更改某些设置。

              编辑: 从您的编辑中,您不能只解析每个选项以查找与该选项关联的“可选”的特殊关键字吗?

              【讨论】:

              • GetPrivateProfile API 仅适用于 Windows。
              • 是的,我想我可以简单地将一些参数视为可选的。但是,我不得不相信有一种更优雅的方式来做到这一点?
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-08-24
              • 2014-07-02
              相关资源
              最近更新 更多