Может ли реализация, которая имеет sizeof (int) == 1 "полностью соответствовать"?
Согласно стандарту C любые символы, возвращаемые fgetc
возвращаются в виде unsigned char
значения ", преобразованные в int
msgstr " (эта цитата взята из стандарта C, в котором говорится, что преобразование действительно есть).
когда sizeof (int) == 1
, много unsigned char
значения находятся за пределами диапазона. Таким образом, возможно, что некоторые из этих unsigned char
значения могут в конечном итоге быть преобразованы в int
значение (результат преобразования "определяется реализацией или повышается сигнал реализации") EOF
, который будет возвращен, несмотря на то, что файл фактически не находится в состоянии ошибки или в конце файла.
Я был удивлен, обнаружив, что такая реализация действительно существует. TMS320C55x CCS ручные документы UCHAR_MAX
имеющий соответствующее значение 65535, INT_MAX
имеющий 32767, fputs
а также fopen
поддержка бинарного режима... Что еще более удивительно, так это то, что кажется, что среда описывается как полностью соответствующая, полная реализация (минус сигналы).
Компилятор C55x C/C++ полностью соответствует стандарту ISO C, как определено в спецификации ISO...
Инструменты компилятора поставляются с полной библиотекой времени выполнения. Все библиотечные функции соответствуют стандарту библиотеки ISO C....
Является ли такая реализация, которая может возвращать значение, указывающее ошибки там, где их нет, действительно полностью соответствующая? Может ли это оправдать использование feof
а также ferror
в разделе условия цикла (как бы отвратительно это ни казалось)? Например, while ((c = fgetc(stdin)) != EOF || !(feof(stdin) || ferror(stdin))) { ... }
1 ответ
Функция fgetc()
возвращает int
значение в диапазоне unsigned char
только когда правильный символ читается, в противном случае возвращается EOF
который является отрицательным значением типа int
,
Мой первоначальный ответ (я его изменил) предполагал, что было целочисленное преобразование в int
, но это не так, так как на самом деле функция fgetc()
уже возвращает значение типа int
,
Я думаю, что, чтобы соответствовать, реализация должна сделать fgetc()
вернуть неотрицательные значения в диапазоне int
если EOF
возвращается
Таким образом, диапазон значений от 32768 до 65535 никогда не будет связан с символьными кодами в реализации TMS320C55x.