Понимание примера getopt ().Сравнение int и char - PullRequest
1 голос
/ 23 февраля 2011

Привет всем. Надеюсь, вы поможете мне понять, почему 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.

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

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

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

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

1 Ответ

6 голосов
/ 23 февраля 2011

Когда целое число сравнивается с символьной константой, как в 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, которое очень похоже.

...