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