现代C++语言核心特性解析
上QQ阅读APP看书,第一时间看更新

1.2.3 wchar_t存在的问题

在C++98的标准中提供了一个wchar_t字符类型,并且还提供了前缀L,用它表示一个宽字符。事实上Windows系统的API使用的就是wchar_t,它在Windows内核中是一个最基础的字符类型:

HANDLE CreateFileW(
 LPCWSTR lpFileName,
 );

CreateFileW(L"c:\\tmp.txt", );

上面是一段在Windows系统上创建文件的伪代码,可以看出Windows为创建文件的API提供了宽字符版本,其中LPCWSTR实际上是const wchar_t的指针类型,我们可以通过L前缀来定义一个wchar_t类型的字符串字面量,并且将其作为实参传入API。

讨论到这里读者会产生一个疑问,既然已经有了处理宽字符的字符类型,那么为什么又要加入新的字符类型呢?没错,wchar_t确实在一定程度上能够满足我们对于字符表达的需求,但是起初在定义wchar_t时并没有规定其占用内存的大小。于是就给了实现者充分的自由,以至于在Windows上wchar_t是一个16位长度的类型(2字节),而在Linux和macOS上wchar_t却是32位的(4字节)。这导致了一个严重的后果,我们写出的代码无法在不同平台上保持相同行为。而char16_tchar32_t的出现解决了这个问题,它们明确规定了其所占内存空间的大小,让代码在任何平台上都能够有一致的表现。