Incohérence dans les définitions de fputwc (), putwc () et putwchar () dans la glibc

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 type wint_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 type wint_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 dans ni dans aucun autre en-tête).

En c , il s’agit d’un typedef de type intégral.