2011-12-19 196 views
5

我在看google go的运行时源代码(在https://go.googlecode.com/hg/src/pkg/runtime/),看起来他们为它们的函数名称使用了一个特殊字符。 (以https://go.googlecode.com/hg/src/pkg/runtime/cgocall.c为例)。这是否被主要编译器接受?这不是ANSI C,是吗?或者它只是一些宏观魔法?C中的非ASCII字符

谢谢!

+0

通过查看例子,我刚刚意识到,仅出现运行时和一些其他的名称之间的符号('运行·cgocall','运行·throw','运行·allm')。 – pmg 2011-12-19 16:23:20

+0

@pmg:它用作名称空间标识符,我认为它非常聪明,非常酷,使用起来非常不方便。 – 2011-12-19 16:25:14

+2

嗯,这*看起来是一种非常聪明的方式来模拟ANSI C中的命名空间。希望这些答案可以探索可能的解决办法,而不仅仅是告诉你这个角色是什么。 – 2011-12-19 16:26:44

回答

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它标准化了。

+0

即使在标识符中?或只在字符串内? – Waneck 2011-12-19 16:44:12

+0

即使在标识符中。查看我刚添加的报价。 – AProgrammer 2011-12-19 16:46:21

+0

Hrm,是的。这让我觉得微软的C编译器无法处理它,因为他们从来没有打算过支持C99。 – 2011-12-19 23:07:40

2

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

+0

它是在ANSI标准中定义的吗? – Waneck 2011-12-19 16:26:47

+0

@Waneck:在扩展字符集http://ascii-table.com/ansi-codes.php。 ANSI编号183。 – Thomas 2011-12-19 16:29:50

+0

它在utf-8中编码为0xC2 0xB7。 – pmg 2011-12-19 16:41:32

1

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

5.1.1.2翻译阶段

1翻译的语法规则中的优先级被指定的遵循 阶段。

  1. 物理源文件的多字节字符被映射,在一种实现中定义 方式,到源字符集(引入新行字符为 结束线指标)如果需要的话。 Trigraph序列被 替换为相应的单字符内部表示。
1

使用中间点是在这里讨论:

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

基本上,使用点是不规范的一部分,但也有一些情况下是必要的。引导,运行时或程序集。

+0

我不明白。如何/为什么需要引导系统?或许,你是在谈论Go语言,而不是这个问题所关联的C代码? – 2011-12-19 16:34:03

+0

我认为这个问题涉及谷歌走的标识符,而不是C标识符。这就是为什么他们必须谈论引导编译器。 – Waneck 2011-12-19 16:45:33

+0

我的理解是,因为已经存在使用中间点的函数,所以Go需要使用cgocall.c中的中间点调用这些函数来调出。 – Derek 2011-12-19 16:53:46