В программе на C++ я хотел бы иметь опцию "только -" с обязательным аргументом. Ниже приведен мой минимальный пример с использованием getopt _long(), но он не работает:
#include
#include
#include
using namespace std;
void help (char ** argv)
{
cout << "`" << argv[0] << "` experiments with long options." << endl;
}
void parse_args (int argc, char ** argv, int & verbose, int & param)
{
int c = 0;
while (1)
{
static struct option long_options[] =
{
{"help", no_argument, 0, 'h'},
{"verbose", required_argument, 0, 'v'},
{"param", required_argument, 0, 0}
};
int option_index = 0;
c = getopt_long (argc, argv, "hv:",
long_options, &option_index);
cout << "c=" << c << endl;
if (c == -1)
break;
switch (c)
{
case 0:
if (long_options[option_index].flag != 0)
break;
printf ("option %s", long_options[option_index].name);
if (optarg)
printf (" with arg %s", optarg);
printf ("\n");
break;
case 'h':
help (argv);
exit (0);
case 'v':
verbose = atoi(optarg);
break;
case 'param':
param = atoi(optarg);
break;
case '?':
abort ();
default:
abort ();
}
}
}
int main (int argc, char ** argv)
{
int verbose = 0;
int param = 0;
parse_args (argc, argv, verbose, param);
cout << "verbose=" << verbose << " param=" << param << endl;
return EXIT_SUCCESS;
}
Я компилирую его с помощью этой команды (gcc версии 4.1.2 20080704 Red Hat 4.1.2 -46):
g++ -Wall test.cpp
Это говорит мне об этом:
test.cpp:44:10: warning: character constant too long for its type
И вот результат:
$./a.out -v 2 --param 3
c=118
c=0
option param with arg 3
c=-1
verbose=2 param=0
Я пытался заставить его работать на ideone но он даже не распознает опцию -v
.
Как указал trojanfoe в своих комментариях к другому вопросу,должна быть возможность использовать опции «только длинные -», потому что GNU tar делает это. Однако GNU tar использует argp , и мне трудно понять его исходный код .
Может ли кто-нибудь дать мне минимальный пример, который работает с GNU getopt_long()
или argp()
?