C中的非ASCII字符

我正在查看谷歌go的运行时源代码(在https://go.googlecode.com/hg/src/pkg/runtime/ ),似乎他们使用特殊字符作为其function名称,·。 (例如, 请访问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 _ abcdefghijklm nopqrstuvwxyz ABCDEFGHIJKLM NOPQRSTUVWXYZ 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翻译语法规则的优先级由以下阶段指定。

  1. 如果需要,物理源文件多字节字符以实现定义的方式映射到源字符集(为行尾指示符引入换行符)。 Trigraph序列由相应的单字符内部表示替换。

使用该中间点在此处讨论:

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

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