我的程序接收三个参数:
int bufferSize
int priority
int milliTimeOut
有没有办法让这些参数中的一些是可选的(并将这些参数值设置为默认值)?
例如,如果用户想要离开priority
作为默认优先级,但要插入bufferSize
and milliTimeOut
,他在运行我的程序时输入了什么,我如何在我的程序中检查它?
我的程序接收三个参数:
int bufferSize
int priority
int milliTimeOut
有没有办法让这些参数中的一些是可选的(并将这些参数值设置为默认值)?
例如,如果用户想要离开priority
作为默认优先级,但要插入bufferSize
and milliTimeOut
,他在运行我的程序时输入了什么,我如何在我的程序中检查它?
您可以实现options,就像您在 Linux 上经常看到的那样。
$ program.exe -b 100 -p 1 -m 100
其中-b
代表bufferSize后跟它的值。同样,-p
and-m
分别代表priority和milliTimeOut,后跟它们的值。
您编写程序来处理这个问题,也就是说,首先解析option,然后解析它的值。然后您可以知道命令行中缺少哪些选项。一旦您知道缺少的选项,您就可以为其(它们)采用默认值。
例如,
$ program.exe -b 100 -m 100
where -p
is missing,这意味着优先级 需要有它的默认值,由你的程序决定。
相似地,
$ program.exe -b 100
其中priority和milliTimeOut是默认的。
这完全取决于您如何解析命令行参数。如果您使用Boost program_options模块,您可以这样做:
#include <boost/program_options.hpp>
namespace po = boost::program_options;
int main(int argc, char *argv[])
{
int bufferSize;
int priority;
int milliTimeOut;
po::options_description desc("Options for my program");
desc.add_options()
// Option 'buffer-size' and 'b' are equivalent.
("buffer-size,b", po::value<int>(& bufferSize)->default_value(8192),
"The buffer's size")
// Option 'priority' and 'p' are equivalent.
("priority,p", po::value<int>(& priority)->default_value(4),
"The priority")
// Option 'timeout' and 't' are equivalent.
("timeout,t", po::value<int>(& milliTimeOut)->default_value(30000),
"Time out in ms")
;
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
// Here your variables have the values specified by the user,
// or the default one.
}
然后你像这样调用你的程序:
program --buffer-size=100000 -t 600000
program -b 100000 --priority=10
program -b 5000 -t 50000 -p 15
program
您未指定的参数将获取其默认值。
您应该阅读包文档,它非常完整和灵活(例如,您只能为某些参数设置默认值)。
是的,您可以使参数成为可选参数,如果在命令行中没有输入任何参数,则提供默认值。举例来说,您可以使用-b
指定缓冲区大小,如果没有输入则假定为 64K:
int main(int argc, char **argv) {
int bufferSize = 65536;
然后是检查命令行参数是否以 开头的繁琐代码-b
,如果是,则从该参数的其余部分读取所需的缓冲区大小。
您可能想使用 Boost program_options来缓解这种情况。