2016-09-23 30 views

回答

3

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

对于char,所述fputc()putc()putchar()功能需要接受可在unsigned charEOF范围,其中EOF可以如此一个int需要保持他们两个负数保持两个值的值。

wchar_t本身必须持有WEOF字符以及作为最大的区域。 WEOF表示适合于wchar_t的值,但不与任何区域设置重叠。

这是因为charwchar_t的名字变得更加混乱,你不应该看到wchar_t作为char但更多的int其大小是不依赖于架构,但上规模最大的语言环境(以及WEOF的值)。


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

引用ISO/IEC 9899:201X 7.19.2:

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

Quoting your link

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

Quoting C++ Reference

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

,wchar_t是一个不同的基本类型(因此它没有在<cwchar>也没有定义任何其他头)。

,这是一个整数类型的typedef

+0

为什么在这个C代码中gcc没有发出警告? 'void f(char c){} void main(void){f((int)65);}'是不是有参数类型不匹配?为什么下面的代码不会发出警告? '... putwchar(getwchar()); ...'根据定义,'putwchar'的参数的类型是** wchar_t **,但是'getwchar'的返回值的类型是** wint_t **。再次 - 类型不匹配。为什么警告不是由编译器产生的? –

+0

如果需要** wchar_t **来保存'WEOF'值,为什么** wint_t **存在? –

+0

'WEOF'的确切值是什么?引用链接http://www.gnu.org/software/libc/manual/html_node/Extended-Char-Intro.html:“ISO 10646被设计为一个31位大代码空间”。所以根据你的回答'WEOF'必须占据一些有效的iso10646字符的地方。这与'EOF'相矛盾:它的值被选择为不与任何有效的8位字符重合。请解释为什么'WEOF'值取自有效的iso10646字符的范围。 –