17

我正在编写 Win32 控制台应用程序,它可以使用如下可选参数启动:

app.exe /argName1:"argValue" /argName2:"argValue"

我是否必须从 argc/argv 变量中手动解析它(以便能够确定存在哪些参数),或者 Win32 API 是否包含一些参数解析器?

4

9 回答 9

16

Win32 不支持解析命令行参数。

请参阅 MSDN 上的相关文章:
解析 C++ 命令行参数
参数定义
自定义 C++ 命令行处理

也看看类似的问题:
C++ 有哪些参数解析器库?
将参数解析
为 C/C++ 的 main() 选项解析器?
在 C++ 中解析命令行参数的有效方法是什么?
...

于 2012-10-02T11:21:03.520 回答
9

Win32 为命令行参数提供的唯一支持是函数GetCommandLineCommandLineToArgvW. argv这与控制台应用程序的参数完全相同。

您必须自己进行解析。正则表达式将是一个不错的选择。

于 2012-10-02T12:45:31.387 回答
6

你可能会弄乱各种库和东西......但有时你需要的只是简单、实用和快速的东西:

int i;
char *key, *value;

for( i = 1; i <= argc; i++ ) {
    if( *argv[i] == '/' ) {
        key = argv[i] + 1;
        value = strchr(key, ':');
        if( value != NULL ) *value++ = 0;
        process_option( key, value );
    } else {
        process_value( argv[i] );
    }
}

你明白了……

这是假设您暗示的普通 Win32 控制台应用程序(具有传统main功能)。对于 Win32 应用程序,您可以使用WinMain,正如另一个人已经评论过的那样。

于 2012-10-02T11:33:04.447 回答
3

仅作记录,如果您使用MinGW 的 GCC,而不是 Microsoft 的 MSVC,您将获得标准运行时库中包含的 GNU getopt(还包括 getopt_long 和 getopt_long_only 变体)。

于 2014-06-25T00:29:57.603 回答
3

您可以通过GetCommandLine, PathRemoveArgs, PathGetArgs在循环中使用

https://msdn.microsoft.com/en-us/library/windows/desktop/bb773742(v=vs.85).aspx来解析参数

于 2016-03-30T18:26:11.243 回答
3

我一直在开发和使用用纯 C 编写的libparamset。它非常强大,并且在 Windows 上运行良好。它提供:

  • 是跨平台的。
  • Windows 上文件输入的通配符支持!
  • 强大的功能。请参阅libparamset
于 2018-03-16T13:58:21.853 回答
2

如果您的需求很简单,您可能想看看Argh!.
它是单个标头并且超级易于使用:

int main(int, char* argv[])
{
    argh::parser cmdl(argv);          // declare

    if (cmdl[{ "-v", "--verbose" }])  // use immediately
        std::cout << "Verbose, I am.\n";

    return EXIT_SUCCESS;
}

通过不打扰,它不会接管你的main()功能。

从自述文件:

哲学

与许多替代方案相反,argh它采用极简主义的自由放任方法,非常适合具有以下规则的简单原型设计:

API 是:

  • 简约但富有表现力:
    • 没有吸气剂或粘合剂
    • 只是[]and()运算符。
    • 简单的迭代(范围for也是)。
  • 你不用为不用的东西付费;
  • 在解析阶段之后std::istream >>,在用户端(通过)转换为类型化变量;
  • 没有因失败而引发的异常。
  • 自由 BSD 许可证;
  • 单个头文件;
  • 没有非std依赖性。

argh不关心:

  • -您的选项之前有多少个“ ”;
  • 您支持哪些标志和选项 - 这是您的责任;
  • 语法验证:任何命令行都是位置参数标志选项的有效(不一定是唯一的)组合;
  • 自动生成使用消息。
于 2017-10-27T11:20:56.017 回答
1

我不相信有可用的 Win32 API。您可以查找getopt或其他库的 Windows 实现。

于 2012-10-02T11:17:35.097 回答
1

不确定是否存在这样的 win32 api 函数,但Boost.Program_Options库可以帮助您。

于 2012-10-02T11:18:12.537 回答