совместимость getopt на разных платформах - PullRequest
2 голосов
/ 03 апреля 2011

В настоящее время я пишу простую программу на C, которая может принимать числовые аргументы командной строки.Но я также хочу, чтобы он имел параметры командной строки.Я заметил несоответствие между различными операционными системами, если один из числовых аргументов отрицателен (т.е. getopt иногда делает / иногда не путает -ve как аргумент).Например:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char* argv[])
{
  char ch;

  while ((ch = getopt(argc, argv, "d")) != -1) {
    switch (ch) {
    case 'd':
      /* Dummy option */
      break;
    default:
      printf("Unknown option: %c\n", ch);
      return 1;
    }
  }
  argc -= optind;
  argv += optind - 1;

  if (argc < 2) {
    fprintf(stderr, "Not enough arguments\n");
    return 1;
  }

  float f = atof(argv[1]);
  printf("f is %f\n", f);
  float g = atof(argv[2]);
  printf("g is %f\n", g);
  return 0;
}

Если я компилирую и запускаю эту программу на Mac и под Cygwin, я получаю следующее поведение:

$ ./getopttest -d 1 -1
f is 1.000000
g is -1.000000

Но если я попробую то же самое на Ubuntu иMingW на Windows Я получаю это:

$ ./getopttest -d 1 -1
./getopttest: invalid option -- '1'
Unknown option: ?

Очевидно, что было немного ошибочно иметь числовые аргументы и параметры рядом друг с другом - но есть ли способ заставить getopt вести себя согласованно?

1 Ответ

0 голосов
/ 03 апреля 2011

Используйте -- для отделения опций от вещей, которые не являются опциями.

$ ./getopttest -d -- 1 -1

никогда не будет пытаться прочитать -1 как опцию.

...