【发布时间】:2017-02-19 07:58:55
【问题描述】:
我正在努力学习使用getopt_long。从wikipedia,我看到了代码
#include <stdio.h> /* for printf */
#include <stdlib.h> /* for exit */
#include <getopt.h> /* for getopt_long; POSIX standard getopt is in unistd.h */
int main (int argc, char **argv) {
int c;
int digit_optind = 0;
int aopt = 0, bopt = 0;
char *copt = 0, *dopt = 0;
static struct option long_options[] = {
{"add", 1, 0, 0},
{"append", 0, 0, 0},
{"delete", 1, 0, 0},
{"verbose", 0, 0, 0},
{"create", 1, 0, 'c'},
{"file", 1, 0, 0},
{NULL, 0, NULL, 0}
};
int option_index = 0;
while ((c = getopt_long(argc, argv, "abc:d:012",
long_options, &option_index)) != -1) {
int this_option_optind = optind ? optind : 1;
switch (c) {
case 0:
printf ("option %s", long_options[option_index].name);
if (optarg)
printf (" with arg %s", optarg);
printf ("\n");
break;
case '0':
case '1':
case '2':
if (digit_optind != 0 && digit_optind != this_option_optind)
printf ("digits occur in two different argv-elements.\n");
digit_optind = this_option_optind;
printf ("option %c\n", c);
break;
case 'a':
printf ("option a\n");
aopt = 1;
break;
case 'b':
printf ("option b\n");
bopt = 1;
break;
case 'c':
printf ("option c with value '%s'\n", optarg);
copt = optarg;
break;
case 'd':
printf ("option d with value '%s'\n", optarg);
dopt = optarg;
break;
case '?':
break;
default:
printf ("?? getopt returned character code 0%o ??\n", c);
}
}
if (optind < argc) {
printf ("non-option ARGV-elements: ");
while (optind < argc)
printf ("%s ", argv[optind++]);
printf ("\n");
}
exit (0);
}
我不太了解option long_options[] 对象。
第一列
我认为long_options[] 的第一个“列”应该是用户在命令行中使用的长标志(-- 后面的任何内容)。
第二栏
我原以为第二列应该只包含 no_argument、required_argument 或 optional_argument,但我看到的不是 0 和 1。
第三栏
第三栏没看懂。
第四列和最大标志数
第四列是在 switch 语句中使用的唯一标识符。但是,如果唯一标识符只能是单个字符,那么我们是否仅限于所有小写字母(26)+所有大写字母(26)+数字(10)+最终一些特殊字符,总共多一点最多超过 62 个不同的参数?这是getopt 的限制吗?如果我弄错了,那么如何在getopt_long (""abc:d:012"") 的第三个参数中指示两个以上的字符来识别标志
我想option long_options[] 的最后一行是当getopt 返回-1 时,因此只要它存在就无关紧要。
【问题讨论】:
-
C++ 不是 C...
-
我想你是指我使用标签
C。那是个错误,我的意思是C++。 (标签已编辑)。谢谢 -
@Remi.b 你第一次把它当作 C++。 amanuel2 编辑了您的问题以将 C++ 标记更改为 C。该代码适用于任何一种语言。如果您试图将其专门理解为 C++ 代码,则 C++ 标记是合适的,请注意该代码并未展示 C++ 最佳实践,您可能会收到关于此的 cmets。
-
维基百科不是手册;
getopt_long()手册的哪一部分引起了问题?
标签: c parameter-passing command-line-arguments getopt getopt-long