Linux программирование в примерах | страница 35



печатает свои собственные сообщения для недействительных опций или отсутствующих аргументов опций.

>int optopt

Когда находится недействительный символ опции, >getopt() возвращает либо '>?', либо '>:' (см ниже), a >optopt содержит обнаруженный недействительный символ.

Люди есть люди, программы неизбежно будут иногда вызываться неправильно либо с недействительной опцией, либо с отсутствующим аргументом опции. Обычно в таких случаях >getopt() выводит свои собственные сообщения и возвращает символ '>?'. Однако, вы можете изменить такое поведение двумя способами.

Во-первых, записав 0 в >opterr перед вызовом >getopt(), можно заставить >getopt() не предпринимать при обнаружении проблем никаких действий.

Во-вторых, если первый символ в >optstring является двоеточием, >getopt() не предпринимает никаких действий и возвращает другой символ в зависимости от ошибки следующим образом:

Неверная опция

>getopt() возвращает '>?', a >optopt содержит неверный символ опции (Это обычное поведение).

Отсутствует аргумент опции

>getopt() возвращает '>:'. Если первый символ >optstring не является двоеточием, >getopt() возвращает '>?', делая этот случай неотличимым от случая неверной опции.

Таким образом, помещение в качестве первого символа >optstring двоеточия является хорошей мыслью, поскольку это позволяет различать «неверную опцию» и «отсутствующий аргумент опции». Расплатой за это является то, что >getopt() в этом случае также не предпринимает никаких действий, заставляя вас выводить собственные сообщения об ошибках. Вот предыдущий пример, на этот раз с обработкой ошибок:

>int ос; /* символ опции */

>char *b_opt_arg;

>while ((ос = getopt(argc, argv, ":ab:")) != -1) {

> switch (oc) {

> case 'a':

>  /* обработка -a, установка соответствующего флага */

>  break;

> case 'b':

>  /* обработка -b, получение значения аргумента из optarg */

>  b_opt_arg = optarg;

>  break;

> case ':':

>  /* отсутствует аргумент опции */

>  fprintf(stderr, "%s: option '-%c' requires an argument\n",

>   argv[0], optopt);

>  break;

> case '?':

> default:

>  /* недействительная опция */

>  fprintf(stderr, "%s: option '-%c' is invalid: ignored\n",

>   argv[0], optopt);

>  break;

> }

>}

Замечание о соглашениях по именованию флагов или опций: в большом количестве кода для Unix используются имена в виде >xflg для любого данного символа опции x (например, >nflg в >echo V7; обычным является также >xflag). Это может быть замечательным для авторе программы, который без проверки документации знает, что означает опция