使用像 wchar_t 这样的类型有什么意义?

What is the sense of using types like wchar_t?

我查看了一些答案和文章,其中指出 wchar_t 用于存储编码为 utf-16 的 unicode 符号。这是有道理的,但是...

变量内容不取决于它的处理方式或格式吗?我们可以获取一个 int 变量并将其格式化为一个字符。我们可以将同样长 2 个字节的 short 也格式化为一个字符,从而获得相同的 2 个字节字符。至少根据我的经验,这从未引起任何错误。此外,据我所知,编译器可能确实将字符视为 int 类型。

为什么会存在 wchar_tchar16_t 这样的类型?不能使用像 short 这样的类型吗?这只是一个惯例,还是 wchar_tshort 的工作方式确实不同?

不保证 wchar_t 的大小跨平台。在 Linux 中,wchar_t 是 4 个字节,但在 Windows 或 AIX 中是 2 个字节。这就是数据类型被抽象出来的原因,它留作平台实现细节。创建宽字符是为了支持 multi-byte 字符,但在此之前存在平台支持的 Unicode 实现。此外,宽字符的编码也可能因平台而异。

short 类型的大小是 platform-dependent。因此,如果您需要使用恰好 16 位的整数,您可以使用 int16_tuint16_t 类型。

使用类型 wchar_t 使代码独立于 wchar_t 的基础类型(即 platform-dependent)。例如,使用类型 wchar_t 的函数可以声明为同样独立于类型 wchar_t.

的基础整数类型

C 标准将类型 wchar_t 定义为整数类型。

wchar_t 

which is an integer type whose range of values can represent distinct codes for all members of the largest extended character set specified among the supported locales;

通常类型 wchar_t 被定义为类型 uint16_tuint32_t 的别名,称为 wchar_t 的基础类型。

What is the sense of using types like wchar_t?

代表特定平台上的宽字符。

Why do types like wchar_t or char16_t even exist?

为什么存在任何类型 - 我们可以对所有内容使用 long long?为什么会有C语言?为程序员提供对机器的抽象。 C 编程语言中的不同类型作为对 machine/platform 特定类型的抽象存在,因此不同的 C 编译器可能会根据平台将相同的代码编译为不同的机器指令。使用 wchar_t 的相同代码可以针对 windows 和 linux 进行编译,并创建具有相同功能的不同可执行文件。存在不同的类型来抽象不同的事物——short 代表一个短数字,一个 wchar_t 代表一个宽字符。这些抽象是为了让编译器可以自由地在机器代码中表示这些语义,并允许程序员编写可读代码。

Cannot types like short be used instead?

short 可以表示 wchar_t 可以表示的所有值的平台上,然后 short 可以用来存储宽字符值。无论如何都不能保证这一点。简单来说,wchar_t 可能比 short 有更多字节。可能存在不能用 short 类型表示的宽字符。还有对齐要求。 char16_t.

类似

char16_tuint_least16_t是同一个类型,你可以用它代替。当然标准可以使用精确的 16 位变量,但是使用 16 位寄存器的操作在特定机器上可能慢得离谱。所以标准给了编译器自由——选择他想要的类型。

Is it just a convention, or wchar_t and short work differently indeed?

可以说,整个C语言只是一种约定俗成。创建一个约定,给其他人一些抽象的东西 from/to 和参考。标准化约定为可移植性奠定了基础。可移植性是指您可以为一个平台编写代码并 运行 无需担心地在另一个平台上编写代码。您可以在特定平台上使用short而不是wchar_t但是您的代码在其他平台上会出人意料地失败。

wchar_t 旨在用作一般的“宽”字符类型,而不是专门的 UTF-16:

7.19 Common definitions <stddef.h>
...
2    The types are
...
        wchar_t

which is an integer type whose range of values can represent distinct codes for all members of the largest extended character set specified among the supported locales; the null character shall have the code value zero. Each member of the basic character set shall have a code value equal to its value when used as the lone character in an integer character constant if an implementation does not define _ _STDC_MB_MIGHT_NEQ_WC_ _.
C 2011 Online Draft

添加了重点。

支持的最大扩展字符集包含的不同值的数量可能大于当前平台的 short 可以表示的数量;它可能要小得多。 wchar_t 将为此调整大小。

不要根据类型占用的字节数来考虑类型 - C 语言定义当然不会。它根据 必须能够表示的值的最小范围 来定义各种类型。一个 short 必须能够表示 至少 范围 [-32767..32767] 中的所有值,这意味着该类型必须包含 至少 16 个值位,但它可能更宽。

在大多数现代真实机器上,本机字大小为 32 或 64 位,所有内容都分解为 8 位字节,但这既不是必需的,也不是保证的。

C 中的 matter 类型,wchar_tshort 表示不同的事物并暗示不同的行为。