C中的非ASCII字符

时间:2011-12-19 16:15:37

标签: c namespaces naming-conventions ansi standards-compliance

我正在查看google go的运行时源代码(在https://go.googlecode.com/hg/src/pkg/runtime/),似乎他们使用特殊字符作为其函数名称,·。 (请查看https://go.googlecode.com/hg/src/pkg/runtime/cgocall.c处的示例)。这是否被主要编译器接受?它不是ANSI C,是吗?或者它只是一些宏观魔法?

谢谢!

4 个答案:

答案 0 :(得分:5)

C90不允许标识符中的附加字符(超过基本字符集中的字符),C99(使用通用字符语法 - \ uXXXX和\ UXXXXXXXX - 以及实现定义的其他字符集)。

C99中的

6.4.2.1/1:

identifier:
    identifier-nondigit
    identifier identifier-nondigit
    identifier digit
identifier-nondigit:
    nondigit
    universal-character-name
    other implementation-defined characters
nondigit: one of
    _ a b c d e f g h i j k l m
    n o p q r s t u v w x y z
    A B C D E F G H I J K L M
    N O P Q R S T U V W X Y Z
digit: one of
    0 1 2 3 4 5 6 7 8 9

我不知道C实现是如何支持的,我知道Plan9 C编译器could handle other characters在它标准化之前。

答案 1 :(得分:2)

你的意思是点吗?它是来自ISO 8859-1(ISO Latin-1)的字符代码183 - 它是一个扩展的ASCII代码(显然)对应于格鲁吉亚逗号,也就是“中间点”。它实际上是一个法律角色。

答案 2 :(得分:1)

The C99 Standard“允许”(对于足够小的“允许”值)“奇怪的字符”

  

5.1.1.2翻译阶段

     

1翻译语法规则的优先级由以下内容指定   相。

     
    
        
  1. 在定义的实现中映射物理源文件多字节字符     方式,到源字符集(引入换行符)     如有必要,可以使用终端指标。 Trigraph序列被替换为     相应的单字符内部表示。
  2.        

答案 3 :(得分:1)

这里讨论使用中间点:

http://code.google.com/p/go/issues/detail?id=793

基本上,使用该点不是规范的一部分,但在某些情况下有必要。引导,运行时或汇编。