Zgodnie z the C standard, wszystkie znaki zwrócone przez fgetc
są zwracane w postaci wartości , "konwertowane na int
" (ten cytat pochodzi ze standardu C, stwierdzając, że rzeczywiście istnieje konwersja).Czy implementacja mająca sizeof (int) == 1 "w pełni zgodna"?
Gdy sizeof (int) == 1
, wiele wartości jest poza zakresem. Jest więc możliwe, że niektóre z tych wartości mogą zostać przekonwertowane na wartość (wynik konwersji wynosi), który zostanie zwrócony, mimo że plik nie znajduje się w błędnym lub końcowym pliku stan.
Zaskoczyło mnie, że taka implementacja faktycznie istnieje. Dokumenty TMS320C55x CCS manualUCHAR_MAX
mające odpowiednią wartość 65535, INT_MAX
mające 32767, fputs
i fopen
obsługujące tryb binarny ... Jeszcze bardziej zaskakujące jest to, że wydaje się opisywać środowisko jako w pełni zgodne, kompletne wdrożenie (sygnały minusowe).
C55x C/C++ kompilator w pełni zgodny z normą ISO C, jak określono w specyfikacji ISO ...
Kompilator narzędzia pochodzą z pełną biblioteką wykonawczego. Wszystkie funkcje biblioteki są zgodne ze standardem biblioteki ISO C. ...
Czy taka realizacja, która może zwrócić wartość wskazującą błędy tam, gdzie ich nie ma, naprawdę pełni zgodne? Czy to może usprawiedliwić użycie feof
i ferror
w sekcji warunku pętli (tak odrażającej, jak się wydaje)? Na przykład, while ((c = fgetc(stdin)) != EOF || !(feof(stdin) || ferror(stdin))) { ... }
@BLUEPIXY "Bajt" w standardowym jest czymkolwiek "char". To niekoniecznie 8 bitów. –
Jestem zdezorientowany, jeśli 'sizeof (int)' to '1', dlaczego' INT_MAX' to '32767'? ta wartość wymaga dwóch 8-bitowych bajtów. I rzeczywiście, bajt może mieć więcej niż 8 bitów, stąd makro 'CHAR_BIT' jest używane do określenia tego. –
@iharob Ten system nie używa 8-bitowych bajtów. – duskwuff