我正在查看 google go 的运行时源代码(在 https://go.googlecode.com/hg/src/pkg/runtime/ ),他们似乎在函数名称中使用了一个特殊字符,·。 (例如 https://go.googlecode.com/hg/src/pkg/runtime/cgocall.c)。这是否被主要编译器接受?这不是 ANSI C,是吗?或者它只是一些宏观魔法?
谢谢!
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 编译器 在标准化之前可以处理其他字符。
你是说点吗?它是来自 ISO 8859-1 (ISO Latin-1) 的字符代码 183 - 它是一个扩展的 ASCII 代码(显然)对应于格鲁吉亚逗号,又名“中间点”。它实际上是一个法律字符。
C99 标准“允许”(对于足够小的“允许”值)“奇怪字符”
5.1.1.2 翻译阶段
1 翻译的语法规则之间的优先级由以下指定 阶段。
- 物理源文件多字节字符被映射,在定义的实现中 方式,到源字符集(为 行尾指示器),如果需要的话。三字母序列被替换为 相应的单字符内部表示。
这里讨论使用那个中间点:
http://code.google.com/p/go/issues/detail?id=793
基本上,使用那个点不是规范的一部分,但在某些情况下是必要的。引导程序、运行时或程序集。