我正在查看google go的运行时源代码(在https://go.googlecode.com/hg/src/pkg/runtime/),似乎他们使用特殊字符作为其函数名称,·。 (请查看https://go.googlecode.com/hg/src/pkg/runtime/cgocall.c处的示例)。这是否被主要编译器接受?它不是ANSI C,是吗?或者它只是一些宏观魔法?
谢谢!
答案 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翻译语法规则的优先级由以下内容指定 相。
- 在定义的实现中映射物理源文件多字节字符 方式,到源字符集(引入换行符) 如有必要,可以使用终端指标。 Trigraph序列被替换为 相应的单字符内部表示。
醇>
答案 3 :(得分:1)