我正在尝试使用long_options []来解析从终端输入到C ++程序的不同选项。我的选项结构如下:
static struct option long_options[] = {
// *name, has_arg, *flag, val
{"help", no_argument, 0, 'h'},
{"debug", no_argument, 0, 0},
{"seed", required_argument, 0, 's'},
...
}
然后,我将使用getopt_long读取参数,如下所示:
while (true) {
int option_index (0);
int c = getopt_long (argc, argv, "hs:t:iT:N:M:m:V:l:w:P:rR:b:d:a:", long_options, &option_index);
if (c == -1) break;
switch (c) {
case 'h':
print_help ();
case 's':
parameters.seed = atoi(optarg);
break;
case 0:
if (long_options[option_index].flag != 0) break;
else if (strcmp(long_options[option_index].name, "debug") == 0) parameters.debug = true;
...
break;
}
}
参数被传递给optarg,据我所知,该类型为char *或std :: string类型,如上所示。
问题出在我想到一种设置选项参数的方法时,需要使用两个或更多参数的数量。例如,我想设置一个选项,该选项允许用户方便地定义分发参数。我希望可以在终端上按如下方式调用它:
./program --distribution mean sd
./program --distribution mean sd n
但是,似乎long_options默认情况下只期望选项一个参数,因此,上面示例中的sd预计将被解析为单独的选项参数。
如何更改此默认行为?谢谢!
最佳答案
You can't,这不是常规做法。
要为您的应用程序提供非常规的命令行参数结构,您必须编写自己的解析器。
一种解决方法是要求您的用户在一个参数中发送多个单词:
./program --distribution 'mean sd n'
尽管您仍然需要自己解析此多字字符串。
Boost.ProgramOptions比旧的
getopt
灵活一些,在很大程度上没有偏离命令行参数的“标准”惯例,但是确定它是否满足您的要求需要进行研究。关于c++ - 使用long_options解析具有任意数量的required_arguments的选项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53485941/