2

考虑一个具有 UTF-8 执行字符集的 C++11 编译器(并且符合要求char类型为有符号 8 位字节的 x86-64 ABI)。

字母 Ä(变音符号)的 unicode 代码点为0xC4,并且有 2 个代码单元 UTF-8 表示{0xC3, 0x84}

编译器为字符字面量分配一个值为 的'\xC4'类型。int0xC4

编译器是否符合标准和 ABI?你的理由是什么?

C++11标准的相关引用:

2.14.3.1

包含单个 c-char 的普通字符文字具有 char 类型,其值等于执行字符集中 c-char 编码的数值。包含多个 c-char 的普通字符文字是多字符文字。多字符文字具有 int 类型和实现定义的值。

2.14.3.4

转义符 \xhhh 由反斜杠后跟 x 后跟一个或多个十六进制数字组成,这些数字用于指定所需字符的值。如果字符文字的值超出为 char 定义的实现定义范围,则它的值是实现定义的

4

3 回答 3

2

§2.14.3 第 1 段无疑是 (C++11) 标准中的相关文本。但原文有几个缺陷,最新版本包含以下文字,重点补充:

多字符文字或包含无法在执行字符集中表示的单个 c-char 的普通字符文字是有条件的,具有 int 类型,并具有实现定义的值。

尽管这已被视为缺陷,但它实际上并不构成任何标准的一部分。但是,它是一个建议,我怀疑许多编译器会实现它。

于 2013-02-25T00:48:58.397 回答
1

从 2.1.14.3p4 开始:

如果字符文字的值超出为定义的实现定义范围,则它是实现定义的char

x86 编译器在历史上(正如您所指出的,这种做法现在已成为某种官方标准)已签署chars. \xc7超出了范围,因此需要实现来记录它将产生的文字值。

看起来您的实现将使用 \x 转义指定的超出范围的字符文字提升为(范围内)整数文字。

于 2013-02-24T22:44:57.517 回答
0

你在混合苹果、橙子、梨和金橘:)

是的,“\xc4”是一个合法的字符文字。具体来说,标准称之为“窄字符文字”。

从 C++ 标准:

基本源字符集成员的字形旨在识别对应于 ASCII 字符集的 ISO/IEC 10646 子集中的字符。然而,因为从源文件字符到源字符集的映射(在翻译阶段 1 中描述)被指定为实现定义,所以需要一个实现来记录基本源字符在源文件中是如何表示的。

这可能有助于澄清:

如果您不熟悉它,这也可能会有所帮助:

这是另一个很好的、简洁的、有启发性的参考:

于 2013-02-24T22:12:52.773 回答