【发布时间】:2020-08-23 15:02:46
【问题描述】:
我们在 C18 标准中阅读:
5.1.1.2 翻译阶段
翻译的语法规则之间的优先级由以下阶段指定。
- 物理源文件多字节字符映射,以实现定义的方式,源字符集(引入换行符作为行尾指示符) 如有必要。
意味着源文件字符集被解码并映射到源字符集。
但是你可以阅读:
5.2.1 字符集
应定义两组字符及其关联的排序序列:编写源文件的集合(源字符集),以及在执行环境中解释的集合(执行字符设置)。
表示源文件字符集是源字符集。
所以问题是:我理解错了哪一个,或者实际上是哪一个错了?
编辑:实际上我错了。请参阅下面的答案。
【问题讨论】:
-
该标准实际上并未使用术语“源文件字符集”。在我看来,源文件的物理格式根本不是由标准定义的,而是由实现定义的,因此它没有进入 5.2.1。
-
但是 5.2.1 似乎说写入源文件的集合成为源字符集,这对我来说没有任何意义。
-
我非正式地理解:程序员必须能够以源字符集编写程序,因为他们必须能够以某种方式使用
+、*等字符。但是实现在文件系统中实际存储的可能不同,翻译回源字符集就是5.1.1.2所指的。 -
其实你指出的字符是基本源字符集的成员,所以你可以随时使用。问题是你不知道实现的源字符集是什么,除非5.2.1是对的,在这种情况下,程序员决定源字符集是什么。这根本没有意义,因为其中一个限制是基本的源字符集成员应该使用单个字节进行编码;如果您决定使用 UTF-16 源文件怎么办?这就是为什么我认为 5.2.1 是错误的,或者我可能理解错了。
-
我不明白您如何得出 5.2.1 允许程序员做出决定的结论,尽管这在实践中可能是正确的。但是标准中没有任何内容要求字符具有唯一的编码,并且 5.1.1.2 允许“以实现定义的方式”翻译多字节字符,这当然足够灵活以支持 UTF-16。
标签: c language-lawyer standards c17