fputwc(),putwc()和putwchar()在glibc中的定义不一致
为什么fputwc()
, putwc()
和putwchar()
接受wchar_t
类型的参数而不是wint_t
? 这与相应的非宽字符函数fputc()
, putc()
和putchar()
相矛盾, 它们采用int
而不是char
。
这是因为wchar_t
需要保持WEOF
值,并且不需要char
来保存EOF
值。
对于char
, fputc()
, putc()
和putchar()
函数需要接受可以在unsigned char
和 EOF
范围内保存这两个值的值,其中EOF
可以是负数,因此需要int
来保存它们。 1
而wchar_t
本身需要持有WEOF
字符以及最大的区域设置。 2 WEOF
表示一个适合wchar_t
但不与任何语言环境重叠的值。 3
由于char
和wchar_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
。