4

我们在 C18 标准中读到:

5.1.1.2 翻译阶段

翻译的语法规则之间的优先级由以下阶段指定。

  1. 如有必要,物理源文件多字节字符以实​​现定义的方式映射到源字符集(为行尾指示符引入换行符)。

这意味着源文件字符集被解码并映射到源字符集。

但是你可以阅读:

5.2.1 字符集

应定义两组字符及其相关的整理序列:写入源文件的字符集(源字符集)和在执行环境中解释的字符集(执行字符集)。

意思就是源文件字符集就是源字符集。

所以问题是:我理解错了哪一个,或者实际上是哪一个?

编辑:其实我错了。请看下面我的回答。

4

3 回答 3

1

这意味着源文件字符集被解码并映射到源字符集。

不,不是那个意思。我的看法是,已经假定源是用源字符集编写的——“将源字符集映射到源字符集”到底有什么意义?他们要么是集合的一部分,要么不是。如果您为源代码选择了错误的编码,它甚至会在预处理开始之前被拒绝。

翻译阶段 1 做了两件与此完全不相关的事情:

  • 解析三元组,它们是标准化的多字节序列。

  • 将多字节字符映射到源字符集(在 5.2.1 中定义)。

    源字符集由基本字符集组成,基本字符集本质上是拉丁字母加上各种常用符号 (5.2.1/3),以及扩展字符集,它是特定于语言环境和实现的。

    多字节字符的定义见 5.2.1.2:

    源字符集可能包含多字节字符,用于表示扩展字符集的成员。执行字符集也可能包含多字节字符,这些字符不必具有与源字符集相同的编码。

    表示各种特定于语言环境的古怪特殊情况,例如特定于语言环境的三元组。

所有这些多字节的疯狂都可以追溯到 1990 年的第一次标准化 - 根据该委员会成员的轶事,这是因为来自不同欧洲国家的成员无法在其国家键盘上使用各种符号。

(我不确定当时这种键盘上的AltGr键有多普遍。无论如何,在非英语键盘上写 C 时,它仍然是一个受到严重按钮混搭的键,以访问{}[]符号等。)

于 2020-08-24T08:57:58.637 回答
1

好吧,毕竟我似乎错了。在联系了 WG14 组的 David Keaton(他们负责 C 标准)后,我得到了这个澄清的答复:

有一个微妙的区别。源字符集是写入源文件的字符集。但是,源字符集只是可用字符的列表,并没有说明任何关于编码的内容。

阶段 1 将源字符集的多字节编码映射到抽象源字符本身。

换句话说,一个看起来像这样的角色:

<字节 1><字节 2>

映射到这个:

<字符 1>

第一个是表示编写程序的源字符集中的字符的编码。第二个是源字符集中的抽象字符。

于 2020-08-25T06:06:44.490 回答
-2

您遇到过交叉编译,其中程序在一种架构上编译并在另一种架构上执行,这些架构具有不同的字符集。

5.1.1.2 在读取早期处于活动状态,其中输入文件被转换为编译器的单个字符集,其中显然必须包含 C 程序所需的所有字符。

但是在交叉编译时,执行字符集可能不同。5.2.1 允许这种可能性。当编译器发出代码时,它必须将所有字符和字符串常量转换为目标平台的字符集。在现代平台上,这是一个无操作,但在一些古老的平台上却不是。

于 2020-08-23T15:15:25.560 回答