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

时间:2014-02-17 10:53:33

标签: ios objective-c llvm

下面的这些变量名称在xCode中都是ALL VALID(编译器在不经过深思之后构建它们)。

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";

是否有某个列表我可以看到我可以用于变量名称的所有有效字符?


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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

  <00> 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

答案 1 :(得分:1)

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

所以,当你写

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