【发布时间】:2019-12-15 13:36:14
【问题描述】:
在 CPP 参考 documentation,
我注意到char
字符类型足够大,可以表示任何 UTF-8 八位 代码单元(C++14 起)
对于char8_t
用于 UTF-8 字符表示的类型,需要足够大 表示任何 UTF-8 代码单元(8 位)
这是否意味着两者都是同一类型?还是char8_t 有其他功能?
【问题讨论】:
-
嗯,很明显
char8_t是一个 8 位类型。此外,char 的签名取决于编译器和目标平台:ARM 和 PowerPC 的默认值通常是无符号的,x86 和 x64 的默认值通常是有符号的。 而char8_t是 总是无符号。 -
" 还是 char8_t 有额外的优势?" - 你这是什么意思?
-
嗯,有有个好处。
char类型,就像 C++ 的大部分 C 遗产一样,并且一直被令人讨厌地破坏。您不知道它是否已签名,而且非常严格地说,您甚至不知道它有多少位(尽管 8 是一个相当安全的赌注,但无法保证)。char8_t类型提供了这两种保证。不幸的是,没有人敢于简单地“修复”损坏的原始类型(诚然,这可能会破坏现有代码,但那又怎样......现代 C++ 无论如何都与传统 C++ 不兼容)。就像没有人愿意将size_t或ptrdiff_t设为正确的 类型。 -
@Damon 根据this comment,没有要求
char8_t正好是八位,所以在这方面没有任何改变...... -
@Damon C 一直保证
char有至少 8 位。 POSIX 和大多数其他系统(如 Windows)保证char正好是 8 位。但是C确实不说“是的,等等等等POSIX”。 POSIX 合并了 C 标准,而不是相反。除非 C 突然决定疏远其利基的很大一部分,否则他们不会强制要求精确的 8 位类型,因为 C 是用于编程所有字节大于 8 的现代嵌入式/利基硬件的主要语言位。