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

时间:2016-09-23 07:39:28

标签: c glibc wchar-t

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

1 个答案:

答案 0 :(得分:3)

这是因为wchar_t需要保留WEOF值,而char不需要保留EOF值。

对于charfputc()putc()putchar()函数需要接受可以包含unsigned char 和<中的两个值的值/ em> EOF范围,其中EOF可以是负数,因此需要int来保存它们。 1

wchar_t本身需要将WEOF字符以及作为最大的区域设置。 2 WEOF代表一个值适合wchar_t但不与任何区域设置重叠。 3

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

1 Why putchar, toupper, tolower, etc. take a int instead of a char?

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

  

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

3 Quoting your link

  

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

4 Quoting C++ Reference

  

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

     

中,<cwchar>是一种独特的基本类型(因此未在typedef中定义,也未在任何其他标题中定义。)

     

中,这是整数类型的public class LinkHandler { static Node hoverNode; }