2015-06-15 17 views
10

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))) { ... }

+3

@BLUEPIXY "Bajt" w standardowym jest czymkolwiek "char". To niekoniecznie 8 bitów. –

+0

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. –

+3

@iharob Ten system nie używa 8-bitowych bajtów. – duskwuff

Odpowiedz

2

Funkcja fgetc() zwraca wartość w zakresie od unsigned char tylko wtedy, gdy właściwy znak jest odczytywany int, w przeciwnym wypadku zwraca EOF która jest wartością ujemną typu int.

Moja odpowiedź oryginalny (I zmieniony) zakłada, że ​​istnieje liczba całkowita konwersja do int, ale nie jest to przypadek, ponieważ w rzeczywistości jest już funkcja fgetc() powrocie wartość typu int.

Myślę, że aby być zgodnym, realizacja musiał dokonać fgetc() do zwracania wartości nieujemne w zakresie int, o ile nie zostanie zwrócony EOF.

W ten sposób zakres wartości od 32768 do 65535 nigdy nie będzie powiązany z kodami znaków w implementacji TMS320C55x.

+0

Rekwizyty dotyczące wyświetlania problemu tutaj. Ta konkretna implementacja może być niezgodna z kontraktem 'fgetc' przez zwracanie wartości ujemnej, gdy nie powinna, lub nieobsługiwanie plików binarnych poprawnie ... – Sebivor

Powiązane problemy