我在看google go的运行时源代码(在https://go.googlecode.com/hg/src/pkg/runtime/),看起来他们为它们的函数名称使用了一个特殊字符。 (以https://go.googlecode.com/hg/src/pkg/runtime/cgocall.c为例)。这是否被主要编译器接受?这不是ANSI C,是吗?或者它只是一些宏观魔法?C中的非ASCII字符
谢谢!
我在看google go的运行时源代码(在https://go.googlecode.com/hg/src/pkg/runtime/),看起来他们为它们的函数名称使用了一个特殊字符。 (以https://go.googlecode.com/hg/src/pkg/runtime/cgocall.c为例)。这是否被主要编译器接受?这不是ANSI C,是吗?或者它只是一些宏观魔法?C中的非ASCII字符
谢谢!
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它标准化了。
即使在标识符中?或只在字符串内? – Waneck 2011-12-19 16:44:12
即使在标识符中。查看我刚添加的报价。 – AProgrammer 2011-12-19 16:46:21
Hrm,是的。这让我觉得微软的C编译器无法处理它,因为他们从来没有打算过支持C99。 – 2011-12-19 23:07:40
The C99 Standard“允许”(为“允许”足够小的值)“奇怪的字符”
5.1.1.2翻译阶段
1翻译的语法规则中的优先级被指定的遵循 阶段。
- 物理源文件的多字节字符被映射,在一种实现中定义 方式,到源字符集(引入新行字符为 结束线指标)如果需要的话。 Trigraph序列被 替换为相应的单字符内部表示。
使用中间点是在这里讨论:
http://code.google.com/p/go/issues/detail?id=793
基本上,使用点是不规范的一部分,但也有一些情况下是必要的。引导,运行时或程序集。
通过查看例子,我刚刚意识到,仅出现运行时和一些其他的名称之间的符号('运行·cgocall','运行·throw','运行·allm')。 – pmg 2011-12-19 16:23:20
@pmg:它用作名称空间标识符,我认为它非常聪明,非常酷,使用起来非常不方便。 – 2011-12-19 16:25:14
嗯,这*看起来是一种非常聪明的方式来模拟ANSI C中的命名空间。希望这些答案可以探索可能的解决办法,而不仅仅是告诉你这个角色是什么。 – 2011-12-19 16:26:44