fputwc(),putwc()和putwchar()在glibc中的定义不一致

为什么fputwc()putwc()putwchar()接受wchar_t类型的参数而不是wint_t ? 这与相应的非宽字符函数fputc()putc()putchar()相矛盾, 它们采用int而不是char

这是因为wchar_t需要保持WEOF值,并且不需要char来保存EOF值。

对于charfputc()putc()putchar()函数需要接受可以在unsigned char EOF范围内保存这两个值的值,其中EOF可以是负数,因此需要int来保存它们。 1

wchar_t本身需要持有WEOF字符以及最大的区域设置。 2 WEOF表示一个适合wchar_t但不与任何语言环境重叠的值。 3

由于charwchar_t的名称,这更加令人困惑,您不应该将wchar_t视为char而应将更多视为int ,其大小不依赖于体系结构,而是依赖于最大区域设置的大小(以及WEOF价值)。 4


1 为什么putchar,toupper,tolower等采用int而不是char?

2引用ISO / IEC 9899: 201x 7.19.2:

WEOF扩展为类型为wint_t的常量表达式,其值不对应于扩展字符集的任何成员。 它被本子条款中的几个函数接受(并返回)以指示文件结束 ,即不再有来自流的输入。 它还用作宽字符值,与扩展字符集的任何成员都不对应。

3 引用您的链接 :

WEOF值为 wint_t类型的常量表达式, 其值与扩展字符集的任何成员不同。

4 引用C ++参考 :

wchar_t其值范围可以表示支持的语言环境中指定的最大扩展字符集的所有成员的不同代码的类型。

在c ++中 , wchar_t是一个独特的基本类型(因此它没有在定义,也没有在任何其他头文件中定义)。

在c中 ,这是一个整数类型的typedef