【发布时间】:2019-04-28 09:11:47
【问题描述】:
我正在尝试使用 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 预计会被解析为单独的选项参数。
如何更改此默认行为?谢谢!
【问题讨论】: