上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_t
和char32_t
的出现解决了这个问题,它们明确规定了其所占内存空间的大小,让代码在任何平台上都能够有一致的表现。