Как использовать no_argument в getopt_long?

Я пытаюсь использовать getopt_long для своего кода. Параметры optional_argument и required_argument работают должным образом, но параметр no_Argument работает неправильно. Вот как я это кодирую.

struct option long_option[] = 
{
  {"auto",required_argument,0,'a'},
  {"help",no_argument,0,'h'},
  {"list",no_argument,0,'l'},
  {0,0,0,0}
};

Теперь, если я скомпилирую и попробую:

./a.out --help 

--> показывает все содержимое справки

./a.out --help 1234 

--> по-прежнему показывает все содержимое справки. Это должно вызвать ошибку, что аргумент не требуется ??


person lokesharo    schedule 02.03.2014    source источник


Ответы (1)


Нет, это не считается ошибкой. getopt_long интерпретирует 1234 как аргумент программы.

В этом примере понятнее:

rm -r -f dir1/ dir2/

Здесь -r и -f — опции, а dir1/ и dir2/ — аргументы программы. Обратите внимание, что если вы выполните rm file1.txt -f, он попытается удалить файл с именем "-f".

person MBlanc    schedule 02.03.2014
comment
... он попытается удалить файл с именем -f.. На самом деле это зависит от реализации rm. На самом деле этого нет в последних версиях Linux. - person alk; 02.03.2014
comment
Хорошо, я понимаю, но тогда какой смысл в опции no_argument в структуре? Чтобы эта вещь работала, мне придется использовать цикл if/else в случае 'h' внутри цикла переключения, чтобы проверить, есть ли какой-либо программный аргумент после --help/--list? - person lokesharo; 03.03.2014