Objective-C文字和标识符的有效ASCII字符列表?

下面的这些variables名是xCode中的所有有效值(编译器无需再考虑构build它们)。

NSString * ª_name = @"something"; NSString * ø_name = @"something"; NSString * ƒ_name = @"something"; NSString * Ç_name = @"something"; NSString * ç_name = @"something"; NSString * º_name = @"something"; NSString * ı_name = @"something"; NSString * ·name = @"SHIFT+OPTION+9"; // Personal favourite NSString * π_name = @"something"; NSString * æ_name = @"something"; 

有没有一个列表,我可以看到所有有效的字符,我可以使用一个variables名?


编辑:他们中的许多人仍然愚弄xcode实际索引 。 所以最好坚持good'ol下划线。 🙂

C90允许在标识符中使用63个众所周知的ASCII字符:拉丁文大写和小写字母,数字和下划线。

自C99以来,在新版本中,clang和gcc都支持“扩展标识符”的概念。 C99标准在附件D中包含了允许的“通用字符”列表。它有点长,所以我只复制拉丁范围:

00AA,00BA,00C0-00D6,00D8-00F6,00F8-01F5,01FA-0217,0250-02A8,1E00-1E9B,1EA0-1EF9,207F

你最喜欢的“中间点”(我也喜欢)在“特殊字符”中find:

00B5,00B7,02B0-02B8,02BB,02BD-02C1,02D0-02D1,02E0-02E4,037A,0559,093D,0B3D,1FBE,203F-2040,2102,2107,210A-2113,2115,2118-211D, 2124,2126,2128,212A-2131,2133-2138,2160-2182,3005-3007,3021-3029

你的源代码实际上是“实现定义”

所以,当你写

 NSString * ª_name = @"something"; 

一个特定的编译器可能会窒息,它不再是可移植的,也不保证它能在下一个版本中工作。

根据C11, §6.4.2标识符

2标识符是一系列非数字字符(包括下划线_,小写和大写拉丁字母以及其他字符)和数字,它们指定了6.2.1中描述的一个或多个实体。 小写字母和大写字母是不同的。 标识符的最大长度没有特别的限制。

3标识符中的每个通用字符名称应指定一个在ISO / IEC 10646中的编码属于D.1.71规定的范围之一的字符。起始字符不应该是通用字符名称,指定编码属于在D.2中规定的范围。 一个实现可能允许不属于基本源字符集的多字节字符出现在标识符中; 哪些字符和它们与通用字符名称的对应是实现定义的。

(强调我的)

在GCC文档中,我们可以阅读下

11.1实现定义的行为

  • 标识符字符。

C和C ++标准允许标识符由“_”和字母数字字符组成。 C ++和C99也允许使用通用字符名称,C99还允许使用实现定义的字符。 如果使用-fextended-identifiers,GCC目前只允许通用字符名称,因为标识符中通用字符名称的实现是实验性的。 …

请注意, 通用字符名称被定义为

  universal-character-name: \u hex-quad \U hex-quad hex-quad