标识符字符集(clang)

gri*_*sha 5 c++ clang identifier

我从不使用铿锵声.

我不小心发现了这段代码:

#include <iostream>

void ???????(int ??????????)
{
    std::cout << ?????????? << std::endl;
}

int main()
{
    int ???????_?????????? = 0;
    ???????(???????_??????????);
}
Run Code Online (Sandbox Code Playgroud)

将编译好:http://rextester.com/NFXBL38644(clang 3.4(clang ++ -Wall -std = c ++ 11 -O2)).

这是一个铿锵声吗?为什么?谢谢.

UPD:我更想问为什么clang做出这样的决定?因为我从来没有找到过有人想要更多字符的讨论,那么c ++标准现在已经有了(2.3,rev.3691)

Car*_*rum 5

与其说它是一个扩展,不如说它是 Clang 对标准多字节字符部分的解释。Clang 支持 UTF-8 源代码文件。

\n\n

至于为什么,我想“为什么不呢?” 是唯一真正的答案;对我来说支持更大的字符集似乎有用且合理。

\n\n

以下是标准(C11草案)的相关部分:

\n\n
\n

5.2.1 字符集

\n\n

1 应定义两组字符及其相关的整理序列:写入源文件的字符集(源字符集)和在执行环境中解释的字符集(执行字符集)。每个集合进一步分为一个基本字符集(其内容由本子条款给出)和一组零个或多个特定于语言环境的成员(不是基本字符集的成员),称为扩展字符。组合集也称为扩展字符集。执行字符集成员的值是实现定义的。

\n\n

2 在字符常量或字符串文字中,执行字符集的成员应由源字符集的相应成员或由反斜杠后跟一个或多个字符组成的转义序列表示。基本执行字符集中应存在\\所有位都为0的字节,称为空字符;它用于终止字符串。

\n\n

3 基本源字符集和基本执行字符集均应具有以下成员: 26个大写字母拉丁字母的

\n\n
A B C D E F G H I J K L M\nN O P Q R S T U V W X Y Z\n
Run Code Online (Sandbox Code Playgroud)\n\n

26个小写字母拉丁字母表中的

\n\n
a b c d e f g h i j k l m\nn o p q r s t u v w x y z\n
Run Code Online (Sandbox Code Playgroud)\n\n

10 位小数

\n\n
0 1 2 3 4 5 6 7 8 9\n
Run Code Online (Sandbox Code Playgroud)\n\n

以下29个图形字符

\n\n
! " # % & \' ( ) * + , - . / :\n; < = > ? [ \\ ] ^ _ { | } ~\n
Run Code Online (Sandbox Code Playgroud)\n\n

空格字符以及代表水平制表符、垂直制表符和换页符的控制字符。源和执行基本字符集的每个成员的表示应适合一个字节。在源和执行基本字符集中,后面每个字符的值0上述十进制数字列表中后面的每个字符的值都应比前一个字符的值大 1。在源文件中,应该有某种方式来指示每行文本的结尾;该国际标准将此类行尾指示符视为单个换行符。在基本执行字符集中,应有代表警报、退格、回车和换行的控制字符。如果在源文件中遇到任何其他字符(标识符、字符常量、字符串文字、标头名称、注释或从未转换为标记的预处理标记除外),则行为未定义。

\n\n

4一封信是指上述定义的大写字母或小写字母;在本国际标准中,该术语不包括其他字母表中的字母。

\n\n

5 通用角色名称构造提供了一种命名其他角色的方法。

\n
\n\n

并且:

\n\n
\n

5.2.1.2 多字节字符

\n\n

1 源字符集可能包含多字节字符,用于表示扩展字符集的成员。执行字符集还可以包含多字节字符,这些字符不需要具有与源字符集相同的编码。对于这两个字符集,以下内容应成立:

\n\n

\xe2\x80\x94 应存在基本字符集,并且每个字符应编码为单个字节。

\n\n

\xe2\x80\x94 任何其他成员的存在、含义和表示都是特定于语言环境的。

\n\n

\xe2\x80\x94 多字节字符集可能具有状态相关的编码,其中每个多字节字符序列以初始移位状态开始,并在序列中遇到特定多字节字符时进入其他特定于语言环境的移位状态。在初始移位状态下,所有单字节字符保留其通常的解释并且不会改变移位状态。序列中后续字节的解释是当前移位状态的函数。

\n\n

\xe2\x80\x94 所有位均为零的字节应解释为与移位状态无关的空字符。此类字节不得作为任何其他多字节字符的一部分出现。

\n\n

2 对于源文件,应满足以下条件:

\n\n

\xe2\x80\x94 标识符、注释、字符串文字、字符常量或标头名称应以初始移位状态开始和结束。

\n\n

\xe2\x80\x94 标识符、注释、字符串文字、字符常量或标头名称应由有效的多字节字符序列组成。

\n
\n