Мое мнение состоит в том, что реализация 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 или, по крайней мере, это было намерением комитета.