Мое мнение состоит в том, что реализация C не может удовлетворять спецификации определенных функций stdio
(особенно fputc
/fgetc
), если sizeof(int)==1
, так как int
должен иметь возможность удерживать любое возможное значение unsigned char
или EOF
(-1). Правильно ли это рассуждение?
(Очевидно, что sizeof(int)
не может быть 1, если CHAR_BIT
равно 8 из-за минимального требуемого диапазона для int
, поэтому мы неявно говорим только о реализациях с CHAR_BIT>=16
, например DSP, где типичные реализации будет самостоятельной реализацией, а не размещенной реализацией и, следовательно, не требуется предоставлять stdio
.)
Изменить. Прочитав ответы и ссылки на некоторые ссылки, некоторые соображения о том, как может быть допустимо, чтобы хостинговая реализация имела sizeof(int)==1
:
Во-первых, некоторые цитаты:
7.19.7.1 (2-3):
Если индикатор конца файла для входного потока, на который указывает поток, не установлен, и следующий символ присутствует, функция fgetc получает этот символ как unsigned char преобразуется в int и продвигает соответствующий индикатор позиции для поток (если определено).
Если указатель конца файла для потока установлен или если поток находится в конце файла, то устанавливается конечный индикатор потока, и функция fgetc возвращает EOF. В противном случае Функция fgetc возвращает следующий символ из входного потока, на который указывает поток. Если возникает ошибка чтения, отображается индикатор ошибки для потока и функция fgetc возвращает EOF.
7.19.8.1 (2):
Функция fread читает в массив, на который указывает ptr, до элементов nmemb размер которого определяется размером, из потока, на который указывает поток. Для каждого объект, звонки по размеру передаются функции fgetc и результаты хранятся в порядке read, в массиве unsigned char, который точно накладывает объект. Фиксированное положение индикатор для потока (если определено) определяется числом успешно прочитанных символов.
Мысли:
-
Чтение
unsigned char
значений вне диапазонаint
может просто иметьundefinedповедение, определенное реализацией в реализации. Это особенно неудобно, так как это означает, что использованиеfwrite
иfread
для хранения двоичных структур (что, в то время как оно приводит к непереносимым файлам, должно быть операцией, которую вы можете выполнять переносимо в любой отдельной реализации), могло бы работать, но тихо терпит неудачу.по существу всегда приводит к поведению undefined. Я согласен с тем, что в реализации может не быть пригодной для использования файловой системы, но гораздо сложнее принять, что в реализации может быть файловая система, которая автоматически вызывает носовых демонов, как только вы попытаетесь ее использовать, и не сможете определить, что она непригодна для использования.Теперь, когда я понимаю, что поведение определено по реализации, а не undefined, оно не так уж неудобно, и я думаю, что это может быть допустимая (хотя и нежелательная) реализация. -
Реализация
sizeof(int)==1
может просто определить, что файловая система будет пустой и доступной только для чтения. Тогда приложение не могло бы считывать какие-либо данные, написанные самим собой, только с устройства ввода наstdin
, которое можно было бы реализовать, чтобы дать только положительные значенияchar
, которые вписываются вint
.
Изменить (снова): Из Обоснования C99, 7.4:
EOF традиционно является -1, но может быть любым отрицательным целым числом и, следовательно, отличным от любого допустимого символьного кода.
Это, по-видимому, указывает на то, что sizeof(int)
может быть не 1 или, по крайней мере, это было намерением комитета.