引入 wchar_t 的 ISO C90 标准没有说明有关表示的任何具体内容。它只要求这种类型能够存储基本字符集的所有元素。
这意味着 thatwchar_t
很可能是 type char
,并且wint_t
可能是 type 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
所以唯一的选择是做它int
,它可以同时保存有符号和无符号char
。
尽管参数被 putchar() 自动转换unsigned char
为 int 或signed char 形式,但在 putwchar() 中没有进行任何排序。
那么,为什么fputwc()
,putwc()
并putwchar()
采取wchar_t
,不是wint_t
?似乎是标准中的一个缺陷。我错过了一些明显的东西吗?
另请参阅为什么需要 islower() 和朋友来处理 EOF?为什么论点类型是putchar()
,fputc()
putc()
char
而不是?以及glibc 中 fputwc()、putwc() 和 putwchar() 的定义不一致
更新
来自 glibc 参考的一些引文
if
wchar_t
被定义为char
类型wint_t
必须被定义为int
由于参数提升。
定义
wchar_t
为char
事实上,这些功能在“ISO Working Paper SC22/WG14/N204 日期为 1992 年 3 月 31 日”(这是发布“ISO/IEC 9899:1990/Amendment 1:1995”之前的最终草案)中具有正确的接口,但是它们被更改了在“ISO/IEC 9899:1990/修正案 1:1995”中。见这里http://www.unix.org/version2/whatsnew/login_mse.html