考虑一个C ++ 11编译器,其执行字符集为UTF-8(并且符合x86-64 ABI,要求char
类型为带符号的8位字节)。
字母Ä(变音符号)的unicode代码点为0xC4
,并且具有2个代码单元UTF-8表示{0xC3, 0x84}
编译器为字符文字'\xC4'
指定int
类型,其值为0xC4
。
编译器是否符合标准且符合ABI标准?你的推理是什么?
C ++ 11标准的相关引用:
2.14.3.1
包含单个c-char的普通字符文字具有char类型,其值等于执行字符集中c-char编码的数值。包含多个的普通字符文字 一个c-char是一个多字符文字。多字符文字具有int类型和实现定义 值。
2.14.3.4
escape \ xhhh由反斜杠后跟x后跟 一个或多个十六进制数字,用于指定所需字符的值。角色的价值 如果文本超出为char
定义的实现定义范围,则literal是实现定义的
答案 0 :(得分:2)
§2.14.3第1段无疑是(C ++ 11)标准中的相关文本。但是,原文中有几个缺陷,最新版本包含以下文字,重点是:
多字符文字,或包含单个c-char的普通字符文字,在执行字符集中无法表示,是有条件支持的,具有类型int ,并且具有实现定义的值。
虽然这已被接受为defect,但它实际上并不构成任何标准的一部分。但是,它是一个建议,我怀疑很多编译器都会实现它。
答案 1 :(得分:1)
从2.1.14.3p4开始:
如果字符文字的值超出为
定义的实现定义范围,则它是实现定义的char
历史上的x86编译器(正如你所指出的那样,这种做法现在是某种形式的官方标准)签署了char
s。 \xc7
超出范围,因此需要实现来记录它将产生的字面值。
看起来你的实现提升了用\ x转义为(范围内)整数文字指定的超出范围的字符文字。
答案 2 :(得分:0)
你正在混合苹果,橘子,梨和金橘:)
是的,“\ xc4”是一个合法的字符文字。具体来说,标准称之为“狭义字符文字”。
来自C ++标准:
基本源字符集成员的字形是 旨在识别ISO / IEC 10646子集中的字符 对应于ASCII字符集。但是,因为映射 从源文件字符到源字符集(描述于 转换阶段1)被指定为实现定义的,a 实现是否需要记录基本源字符的方式 在源文件中表示。
这可能有助于澄清:
如果您不熟悉它,这也可能会有所帮助:
这是另一个好的,简洁的 - 有启发性的 - 参考: