Pourquoi fputwc()
, putwc()
et putwchar()
prennent-ils un argument de type wchar_t
au lieu de wint_t
? Ceci contredit les fonctions de caractère non-large correspondantes fputc()
, putc()
et putchar()
, qui prennent int
, pas char
.
En effet, wchar_t
doit contenir une valeur WEOF
et char
n’est pas nécessaire pour conserver une valeur EOF
.
Pour char
, les fonctions fputc()
, putc()
et putchar()
doivent accepter des valeurs pouvant contenir les deux valeurs dans la plage unsigned char
et EOF
, où EOF
peut être un nombre négatif, de sorte qu’un int
est nécessaire pour les contenir. 1
Alors que wchar_t
lui-même est requirejs pour contenir un caractère WEOF
ainsi que la plus grande locale. 2 WEOF
représente une valeur qui convient à wchar_t
mais ne chevauche aucune locale. 3
Ceci est rendu plus confus par les noms de char
et wchar_t
, vous ne devriez pas voir wchar_t
comme un caractère, mais plutôt comme un int
dont la taille ne dépend pas de l’architecture, mais de la taille de la plus grande locale (et du valeur de WEOF
). 4
1 Pourquoi putchar, toupper, tolower, etc., prenez un int au lieu d’un omble?
2 Citant ISO / IEC 9899: 201x 7.19.2:
WEOF
qui se développe en une expression constante de typewint_t
dont la valeur ne correspond à aucun membre du jeu de caractères étendu. Il est accepté (et renvoyé) par plusieurs fonctions de ce sous-paragraphe pour indiquer la fin du fichier , c’est -à- dire qu’il n’y a plus d’entrée dans un stream. Il est également utilisé comme valeur de caractère large qui ne correspond à aucun membre du jeu de caractères étendu.
3 Citation de votre lien :
La macro
WEOF
à une expression constante de typewint_t
dont la valeur est différente de tout membre du jeu de caractères étendu.
4 Référence de la référence C ++ :
wchar_t
Type dont la plage de valeurs peut représenter des codes distincts pour tous les membres du plus grand jeu de caractères étendus spécifié parmi les parameters régionaux pris en charge.En c ++ ,
wchar_t
est un type fondamental distinct (il n’est donc pas défini dansni dans aucun autre en-tête).
En c , il s’agit d’un
typedef
de type intégral.