Как в C++ использовать только длинные параметры с обязательным аргументом?

В программе на 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()?

5
задан Community 23 May 2017 в 12:10
поделиться