【发布时间】:2020-07-11 10:26:57
【问题描述】:
似乎每个人都认为wint_t 至少和wchar_t 一样大。但是 C 标准允许 wchar_t 范围的值不直接对应于扩展字符集中的任何字符:
值
WCHAR_MIN和WCHAR_MAX不一定对应于扩展字符集的成员。
和:
wchar_t,它是一个整数类型,其值范围可以表示支持的语言环境中指定的最大扩展字符集的所有成员的不同代码;空字符的代码值为零。
并且wint_t 必须能够仅保存扩展字符集成员的值和至少一个WEOF 的附加值:
wint_t,它是一个默认不变的整数类型,参数promotions可以保存任何对应于扩展字符集成员的值,以及至少一个不对应于任何扩展字符集成员的值(见下文WEOF);
wint_t 在默认参数提升下保持不变的要求也不意味着 wint_t 大于 wchar_t,因为 wchar_t 也可能大到足以在默认参数提升下保持不变。
因此,在一些虚构的实现中,wchar_t 可能被定义得足够大,以容纳许多不在扩展字符集中的不必要值,并绕过默认参数提升。然后,此实现可以选择不在wint_t 中包含这些值。这允许wchar_t 大于wint_t。
根据wchar_t 的标准大小必须至少为 1 字节,wint_t 至少为 2 字节。 (假设 8 位字节)
同样在 Microsoft Visual Studio 中 wint_t 是 typedef 到 unsigned short。这如何满足默认参数促销保持不变的要求?我认为 C 允许使用 2 字节 wint_t,因为 int 在某些实现中可能是 2 字节。
【问题讨论】:
-
这个note 似乎相关。
-
@KamilCuk,wchar_t 和 wint_t 可能是相同的整数类型,但这并不意味着它们必须是。尽管在通常使用 UTF 编码的实现中它们是。我关心的是 c 通常特别不寻常的实现。
-
gnu.org/software/libc/manual/html_node/Extended-Char-Intro.html
in the GNU C Library wchar_t is always 32 bits wide -
gcc 使用 UTF-32 所以 wchar_t 是 4 个字节。
-
在 GNU C 库中,
wchar_t是typedef int,wint_t是typedef unsigned int。
标签: c language-lawyer eof wchar-t