Пример использования getopt (). Сравнение int с char

Привет всем, надеюсь, вы поможете мне понять, почему getopt использовал int и как обрабатывается переменная optopt в getopt. Довольно новичок в C ++.

Если посмотреть на getopt, optopt определяется как целое число. http://www.gnu.org/software/libtool/manual/libc/Using-Getopt.html#Using-Getopt

и приведенный здесь пример: http://www.gnu.org/software/libtool/manual/libc/Example-of-Getopt.html#Example-of-Getopt

В этом примере я не понимаю, как целое число `c 'сравнивается с символом в операторе switch.

Насколько я понимаю, основной аргумент geopt работает, хотя это массив символов argv, поэтому тот факт, что он возвращает int, кажется мне странным, я ожидал, что это будет char, и мне потребуется привести любые числовые аргументы к int. Преобразуется ли символ автоматически в его код ANSI и обратно или что-то в этом роде? Статус printf

fprintf (stderr, "Unknown option `-%c'.\n", optopt);

Ожидает char, как я понимаю, но получает int. Зачем getopt использовать int при работе с массивом символов?

Я упускаю что-то действительно очевидное? Я должен быть.


person Tommy    schedule 23.02.2011    source источник
comment
Не совсем вопрос C ++ ... Добавлен тег C   -  person neuro    schedule 23.02.2011
comment
@neuro: добавление тега C - хорошая идея, но если OP на самом деле пишет на C ++, это очень важно, поскольку это одна из точек, где языки различаются.   -  person Fred Foo    schedule 23.02.2011


Ответы (1)


Когда целое число сравнивается с символьной константой, как в optopt == 'c', символьная константа фактически имеет тип int. Фактически, в C char и short являются гражданами второго сорта и всегда повышаются до int в выражениях, поэтому бесполезно передавать или возвращать char; в любом случае он повышен до int.

Это отличается от правил C ++, но вы должны помнить об этом при использовании функций C, таких как getopt и printf, в программе на C ++.

Тот факт, что getopt возвращает int, имеет дополнительную причину: он может возвращать либо допустимое значение char (обычно 0..255) , либо -1. Если вы хотите получить char из getopt, вы должны сначала проверить возможность -1:

int i = getopt(argc, argv, option_string);
if (i == -1)
    // no more options
else {
    char c = i;
    // got a valid char, proceed
}

Если бы getopt вернул char, тогда не было бы никакого способа отличить возможно действительный (char)(-1) (-1 или 255) от условия остановки. См. эту страницу для лучшего объяснения в контексте значения EOF. , что очень похоже.

person Fred Foo    schedule 23.02.2011
comment
@larsman, нет, это даже более прямо, чем это. В C такие константы, как 'a', относятся к типу int, а не к типу char. Так что продвигать нечего. - person Jens Gustedt; 23.02.2011
comment
Спасибо, это имеет смысл. Особенно ссылка EOF. Просто посмотрел на это тоже, что дополняло ваше объяснение. iu.hio.no/~mark/CTutorial/CTutorial.html# символ - person Tommy; 23.02.2011
comment
@Tommy: в этом руководстве ошибочно указано, что (1) char всегда имеет диапазон -128..127, что не обязательно, и (b) char хранит символы ASCII. В некоторых системах char имеет диапазон 0..255, и в любом случае он может хранить восьмибитные символы (например, Latin-1 или UTF-8, как multi-char символы), а также ASCII. - person Fred Foo; 23.02.2011
comment
Фактически, существуют системы, в которых char имеет ширину 16 или 32 бита. - person ninjalj; 23.02.2011
comment
getopt может обрабатывать гораздо больше, чем просто 255 параметров, и, таким образом, также будет возвращать значения выше ›255, если они используются. Предел, казалось бы, увеличивается до INT_MAX, поскольку struct getopt (для getopt_long) использует целые числа. - person user611775; 24.02.2011
comment
@ user611775: getopt должен возвращать следующий символ параметра [...] из argv, который имеет тип char * const [], поэтому на самом деле максимум CHAR_MAX и \0 не может использоваться (pubs.opengroup.org/onlinepubs/9699919799/functions/getopt.html). Никто не упомянул getopt_long. - person Fred Foo; 24.02.2011