Я считаю, что реализация 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 получает этот символ как неподписанный
char преобразуется в int и перемещает соответствующий индикатор позиции файла для
поток (если определен).
Если установлен индикатор конца файла для потока или если поток находится в конце файла, индикатор конца файла для потока установлен, и функция fgetc возвращает EOF. В противном случае
Функция fgetc возвращает следующий символ из входного потока, на который указывает поток.
Если происходит ошибка чтения, устанавливается индикатор ошибки для потока и функция fgetc
возвращает EOF.
7.19.8.1 (2):
Функция fread считывает в массив, на который указывает ptr, до nmemb элементов
чей размер определяется размером от потока, на который указывает поток. Для каждого
объект, вызовы размера выполняются для функции fgetc и результаты сохраняются в порядке
читай, в массиве unsigned char точно наложение объекта. Позиция файла
индикатор для потока (если он определен) увеличивается на количество успешно прочитанных символов.
Мысль:
Считывание unsigned char
значений вне диапазона int
может просто иметь undefined определяемое реализацией поведение в реализации. Это особенно тревожно, так как это означает, что использование fwrite
и fread
для хранения бинарных структур (которое, в то время как это приводит к непортативным файлам, должно быть операцией, которую вы можете выполнить переносимо в любой отдельной реализации) может показаться работающим, но молча провалиться по существу всегда приводит к неопределенному поведению . Я согласен с тем, что реализация может не иметь пригодной для использования файловой системы, но гораздо сложнее признать, что реализация может иметь файловую систему, которая автоматически вызывает назальных демонов, как только вы попытаетесь ее использовать, и не сможете определить, что она непригодна для использования. Теперь, когда я понимаю, что поведение определяется реализацией, а не неопределенно, это не так тревожно, и я думаю, что это может быть допустимой (хотя и нежелательной) реализацией.
Реализация sizeof(int)==1
может просто определить файловую систему как пустую и доступную только для чтения. Тогда приложение не сможет считывать любые данные, записанные им самим, только с устройства ввода на stdin
, которое может быть реализовано так, чтобы выдавать только положительные значения char
, которые соответствуют int
.
Редактировать (снова): Из Обоснования C99, 7.4:
EOF традиционно равен -1, но может быть любым отрицательным целым числом и, следовательно, отличается от любого допустимого кода символа .
Это, кажется, указывает на то, что sizeof(int)
не может быть 1 или, по крайней мере, так было задумано комитетом.