引入了wchar_t的ISO C90标准并没有说明关于该表示的任何具体内容。它只需要 这种类型能够存储基本字符集的所有元素。为什么参数类型的`putwchar()`,`fputwc()`和`putwc()`不是`wint_t`?
这意味着wchar_t
可能是char
类型,并且wint_t
可以是int
类型的 。此外,在一些实现中,wchar_t
可以被签名, 并且在一些 - 无符号的。情况与putchar()
有何不同?
为了比较,的putchar()
,putc()
和fputc()
参数选择为int
。
我认为,没有任何的库函数,其处理单 字符char
(仅适用于int
)工作,因为即使 他们中的一些不使用EOF(像putchar()
),我们不能使其char
类型, 因为如果它是char
,我们强制转换为unsigned char
(的char
的符号性不规范),就不会有像
void f(char c) { ...
...
int x = 't';
f((unsigned char)x);
...
warning: conversion to ‘char’ from ‘unsigned char’ may change the sign of the result
S型 转换警告o唯一的选择是使它成为int
,它可以保存签名和未签名的char
。
尽管通过putchar()函数自变量转换为unsigned char
,即使它是作为int或signed char传递的,但在putwchar()函数中不会执行任何操作。
那么,为什么fputwc()
,putwc()
和putwchar()
采取wchar_t
,不wint_t
?看起来像标准中的缺陷。我错过了明显的东西吗?
参见和Why argument type of putchar()
, fputc()
and putc()
is not char
?和Inconsistency in definitions of fputwc(), putwc() and putwchar() in glibc
UPDATE
如果
wchar_t
被定义为char
从glibc的参考一些报价wint_t
必须定义为类型由于参数提升。
这将是合法的定义
wchar_t
为char
是事实,这些功能已经在 “ISO工作文件SC22/WG14/N204月31日1992年3月” 正确的接口(其中是发布“ISO/IEC 9899:1990 /修订版1:1995”之前的最终草案),但在“ISO/IEC 9899:1990 /修订版1:1995”中进行了修改。看到这里http://www.unix.org/version2/whatsnew/login_mse.html
'fputc'的定义是正确的,它不需要改变 - 阅读OP的基本原理,这里http://stackoverflow.com/a/40732303/1487773/和'fputwc'是不正确的 - 出于同样的原因因为wchar_t与char没有区别 - 请参阅OP) –
宽字符的所有功能都必须类似于普通字符的功能,不包括自动提升发挥作用的情况。 –