cppreference的page on phases of translation,对于翻译的第一阶段(在C23之前),在其步骤2中有一个注解:
接受的源文件字符集是实现定义的(C11起)
这在a working draft of the spec (for instance, for C++20)中也有体现。
鉴于此,在C23之前,它似乎总是实现定义的源代码文件的字节如何Map到基本源字符集的字符,上面的规则在C11实现时增加了什么?即拥有它与不拥有它的净变化是什么?这可能只是一个阅读理解问题,但对我来说似乎不清楚,因为它接着说:
任何无法Map到基本源字符集中的字符的源文件字符都将被其通用字符名(用\u或\U转义)或某种实现定义的形式(以等效方式处理)替换。
例如,C11的增加是否意味着由实现来决定将哪些字符Map到基本源字符集或Map到通用字符名(即允许跳过源文件中的字符,根本不翻译它们)?否则,通过上面关于Map到基本源字符或通用字符名称或等效物的一点,我不清楚C11规则在cppreference页面上第1阶段第1步之后实现了什么,即:
源代码文件的各个字节被Map(以实现定义的方式)到基本源字符集的字符
1条答案
按热度按时间kyxcudwk1#
在C11之前,唯一直接可用的字符是基本源字符集中的字符,其他字符需要转义。
从C11开始,实现定义了除了基本源字符集之外,哪些字符可以不转义,哪些可以转义。
从C++23开始,所有Unicode字符都可以使用,而无需转义。