Я работаю над окнами, поэтому мне пришлось скомпилировать getopt и getopt_long из этого превосходного источника
Я изменил getopt_long.c (ниже) для размещения двух входных аргументов. Я не беспокоился о более общем случае множественных аргументов, поскольку для этого потребовалось бы больше (и чище) переделок, чем у меня было время / потребность. Второй аргумент помещен в другой глобал, "optarg2".
Если вам не нужно компилировать getopt из исходного кода, ответ Фрэнка выше более элегантен.
extern char * optarg2
.
.
.
int getopt_long(nargc, nargv, options, long_options, index)
{
.
.
.
if (long_options[match].has_arg == required_argument ||
long_options[match].has_arg == optional_argument ||
long_options[match].has_arg == two_req_arguments) {
if (has_equal)
optarg = has_equal;
else
optarg = nargv[optind++];
if (long_options[match].has_arg == two_req_arguments) {
optarg2 = nargv[optind++];
}
}
if ((long_options[match].has_arg == required_argument ||
long_options[match].has_arg == two_req_arguments)
&& (optarg == NULL)) {
/*
* Missing argument, leading :
* indicates no error should be generated
*/
if ((opterr) && (*options != ':'))
(void)fprintf(stderr,
"%s: option requires an argument -- %s\n",
__progname(nargv[0]), current_argv);
return (BADARG);
}
if ((long_options[match].has_arg == two_req_arguments)
&& (optarg2 == NULL)) {
/*
* Missing 2nd argument, leading :
* indicates no error should be generated
*/
if ((opterr) && (*options != ':'))
(void)fprintf(stderr,
"%s: option requires 2nd argument -- %s\n",
__progname(nargv[0]), current_argv);
return (BADARG);
}
Вам также нужно добавить определение в getopt.h для "two_required_args" или "множественные_args", как вы считаете нужным.
редактировать: у меня плохо с уценкой