In base a the C standard, tutti i caratteri restituiti da fgetc
vengono restituiti sotto forma di valori unsigned char
, "convertiti in un int
" (quella citazione proviene dallo standard C, affermando che esiste effettivamente una conversione).Un'implementazione che ha sizeof (int) == 1 "completamente conforme"?
Quando sizeof (int) == 1
, molti valori unsigned char
non rientrano nell'intervallo. È quindi possibile che alcuni di questi valori unsigned char
possano essere convertiti in un valore int
(il risultato della conversione è "implementation-defined or an implementation-defined signal is raised") di EOF
, che verrebbe restituito nonostante il file non sia effettivamente in un file errato o di fine file stato.
Sono stato sorpreso di scoprire che tale implementazione esiste realmente. Il TMS320C55x CCS manual documenti UCHAR_MAX
con un valore corrispondente di 65535, INT_MAX
con 32767, fputs
e fopen
che supporta la modalità binaria ... Ciò che è ancora più sorprendente è che sembra descrivere l'ambiente come un'implementazione completa e completamente conforme (segnali meno).
Il C55x C/C++ è pienamente conforme allo standard ISO C, come definito dalle specifiche ISO ...
Il compilatore strumenti sono dotati di una completa libreria di runtime. Tutte le funzioni della libreria sono conformi allo standard di libreria ISO C. ...
è una tale implementazione in grado di restituire un valore che indica gli errori in cui non ce ne sono, in realtà pienamente conforme? Questo potrebbe giustificare l'uso di feof
e ferror
nella sezione delle condizioni di un loop (per quanto orribile possa sembrare)? Ad esempio, while ((c = fgetc(stdin)) != EOF || !(feof(stdin) || ferror(stdin))) { ... }
@BLUEPIXY Un "byte" in standardese è qualunque sia un 'char'. Non è necessariamente 8 bit. –
Sono confuso, se 'sizeof (int)' è '1', come mai' INT_MAX' è '32767'? quel valore richiede due byte da 8 bit. E infatti, un byte potrebbe essere più di 8 bit, quindi la macro 'CHAR_BIT' è usata per determinarlo. –
@iharob Questo sistema non usa byte a 8 bit. – duskwuff