我正在编写Win32控制台应用程序,可以使用这样的可选参数启动:
app.exe /argName1:"argValue" /argName2:"argValue"
我是否必须手动解析它(以便能够确定哪些参数存在)来自argc / argv变量,或者Win32 API是否包含一些参数解析器?
答案 0 :(得分:13)
解析命令行参数没有Win32支持。
参见MSDN的相关文章:
Parsing C++ Command-Line Arguments
Argument Definitions
Customizing C++ Command-Line Processing
也看一下类似的问题:
What parameter parser libraries are there for C++?
Parsing parameters to main()
Option Parsers for C/C++?
What's an effective way to parse command line parameters in C++?
...
答案 1 :(得分:7)
Win32为命令行参数提供的唯一支持是函数GetCommandLine
和CommandLineToArgvW
。这与控制台应用程序的argv
参数完全相同。
您必须自己进行解析。正则表达式将是一个很好的选择。
答案 2 :(得分:3)
你可以搞乱各种各样的库和东西......但有时候你需要的只是简单,实用和快捷:
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
,而另一个人已经评论过。
答案 3 :(得分:2)
只是为了记录,如果您使用MinGW's GCC而不是Microsoft的MSVC,您将获得GNU getopt(其中还包括getopt_long和getopt_long_only变体),包含在标准运行时库中。
答案 4 :(得分:2)
您可以在循环中使用GetCommandLine, PathRemoveArgs, PathGetArgs
来解析参数
https://msdn.microsoft.com/en-us/library/windows/desktop/bb773742(v=vs.85).aspx
答案 5 :(得分:2)
我一直在开发和使用用简单C编写的libparamset。它非常强大,在Windows上运行良好。 它提供:
答案 6 :(得分:1)
如果您的需求很简单,您可能需要查看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是:
- 简约但富有表现力:
- 没有吸气剂或粘合剂
- 只需
[]
和()
运营商。- 轻松迭代(范围 -
for
)。- 你不支付你不使用的东西;
- 在解析阶段之后,在用户端上转换为类型变量(通过
std::istream >>
);- 没有因失败而抛出异常。
- 自由BSD许可证;
- 单头文件;
- 没有非
std
依赖项。
argh
不关心:
- 在您的选项之前有多少'
-
';- 您支持哪些标志和选项 - 这是您的责任;
- 语法验证:任何命令行是位置参数,标志的有效(不一定是唯一的)组合>和 选项;
- 自动生成使用信息。
答案 7 :(得分:0)
我不相信有可用的Win32 API。您可以查找getopt或其他库的Windows实现。
答案 8 :(得分:0)
不确定是否存在这样的win32 api函数,但Boost.Program_Options库可以帮助您。