De mon point de vue est qu'une œuvre ne peut pas satisfaire à la spécification de certains stdio
fonctions (en particulier fputc
/fgetc
) si sizeof(int)==1
, depuis l' int
doit être capable de tenir toute valeur possible de unsigned char
ou EOF
(-1). Est-ce que ce raisonnement correct?
(Évidemment sizeof(int)
ne peut pas être 1 si CHAR_BIT
8, en raison du minimum requis gamme pour int
, nous sommes donc implicitement ne parlons que des implémentations avec CHAR_BIT>=16
, par exemple, les Dsp, typique des implémentations serait un autoportant mise en œuvre plutôt que de hébergé mise en œuvre, et donc pas nécessaire de fournir de l' stdio
.)
Edit: Après avoir lu les réponses et quelques liens de références, quelques réflexions sur les façons c'est peut-être valable pour une hébergé mise en œuvre de disposer sizeof(int)==1
:
Tout d'abord, quelques citations:
7.19.7.1(2-3):
Si la fin de fichier indicateur pour l'entrée de flux pointé par stream n'est pas définie et qu'un le caractère suivant est présent, la fonction fgetc obtient que le caractère non signé char converti en int et avances le fichier associé indicateur de position pour la flux (si défini).
Si la fin de fichier indicateur pour le stream est activé, ou si le flux est en fin de fichier, la fin de fichier indicateur pour le flux est défini et la fonction fgetc retourne EOF. Sinon, l' la fonction fgetc renvoie le caractère suivant à partir de l'entrée de flux pointé par stream. Si une erreur de lecture se produit, l'indicateur d'erreur pour le flux est défini et la fonction fgetc retourne EOF.
7.19.8.1(2):
La fonction fread lit, dans le tableau pointé par ptr, jusqu'à nmemb éléments dont la taille est spécifiée par la taille, à partir du flux pointé par stream. Pour chaque objet, de la taille des appels sont faits à la fonction fgetc et les résultats stockés, dans l'ordre lire, dans un tableau de unsigned char exactement la superposition de l'objet. La position dans le fichier de indicateur pour le stream (si défini) est avancée par le nombre de caractères lus.
Pensées:
La lecture arrière
unsigned char
valeurs en dehors de la plage deint
pourrait tout simplementpas définide mise en œuvre définies par le comportement dans la mise en œuvre. Cela est particulièrement inquiétant, car il signifie que l'utilisation defwrite
etfread
pour stocker des structures binaires (qui, même s'il en résulte non portables fichiers, est censé être une opération que vous pouvez effectuer de façon portable sur n'importe quel unique de mise en œuvre) pourrait apparaître à travailler, mais en silence l'échec.essentiellement aboutit toujours à un comportement indéfini. J'accepte qu'une mise en œuvre peut ne pas avoir de système de fichiers utilisable, mais c'est beaucoup plus difficile à accepter qu'une mise en œuvre pourrait avoir un système de fichiers qui appelle automatiquement nasale démons dès que vous essayez de l'utiliser, et aucun moyen de déterminer qu'il est inutilisable.Maintenant que je me rends compte du comportement de la mise en œuvre est définie et non pas défini, il n'est pas si inquiétante, et je pense que cela pourrait être un valide (bien que pas souhaitable) de mise en œuvre.Une mise en oeuvre
sizeof(int)==1
pourrait définir simplement le système de fichiers soit vide et en lecture seule. Alors il n'y aurait aucun moyen d'une application peut lire les données écrites par lui-même, uniquement à partir d'un périphérique d'entrée surstdin
qui pourrait être mis en œuvre de façon à ne donner qu'positifchar
des valeurs qui s'inscrivent dansint
.
Edit (encore une fois): à Partir de la C99 Justification, 7.4:
EOF est traditionnellement -1, mais peut-être n'importe quel nombre entier négatif, et donc à distinguer de tout caractère valide code.
Cela semble indiquer qu' sizeof(int)
peut ne pas être de 1, ou, au moins, que telle était l'intention du comité.