我是新的C和看围棋的源代码树,我发现这一点:
https://code.google.com/p/go/source/browse/src/pkg/runtime/race.c
void runtime∕race·Read(int32 goid, void *addr, void *pc);
void runtime∕race·Write(int32 goid, void *addr, void *pc);
void
runtime·raceinit(void)
{
// ...
}
什么是斜线和点(·)是什么意思? 这是有效的C?
重要更新:
最终的答案肯定是你从拉斯考克斯得到了一个 ,围棋作家之一,golang坚果邮件列表上。 这就是说,我要离开我的一些早期的音符下面,它们可能有助于了解一些事情。
另外,从阅读这个答案上面链接,我相信∕
伪斜杠”现在可以转换为普通/
斜线太(像middot转换为点)在Go C编译器比一个较新版本我测试过下面 - 但我没有时间来验证。
该文件由编译围棋语言套房的内部C编译器 ,它起源于计划9 C编译器(1) (2) ,并具有一定的差异 (主要是扩展,据我所知)到C标准。
一个扩展的是,它允许UTF-8字符的标识符。
现在,Go语言套件的C编译器,middot字符(·)是一种特殊的方式处理,因为它翻译成规则的点(。)在目标文件,这是围棋语言套房的内部连接器解释为命名空间分隔字符。
例
对于下列文件example.c
(注意:它必须保存为UTF-8无BOM):
空隙·BAR1(){} 空隙FOO·BAR2(){} 空隙富/巴兹·BAR3(){}
内部C编译器产生如下符号:
$去工具8C example.c $去工具纳米example.8 T “” .Bar1 Ťfoo.bar2 牛逼富/ baz.bar3
现在,请注意我已经给·Bar1()
资本B
。 这是因为这样一来,我可以把它定期Go代码可见 - 因为它被翻译成完全相同的象征,会导致编译如下Go代码:
例如包 FUNC BAR1(){} //纳米将显示:T “” .Bar1
现在,关于你的问题命名的功能,这个故事进一步下降兔子洞。 我有点不太肯定,如果我在这里,但我会尽量根据我所知道的解释。 因此,就好像它已经“低于这个点的每个句子应该读AFAIK ”只是写在最后。
因此,为了更好地理解这个难题所需要的未来缺少的部分,是为了多了解一下怪""
命名空间,以及GO套件的连接器如何处理它。 在""
命名空间是我们可能要叫“”(因为空""
一个程序员是指“空字符串”)命名空间,或者也许更好,一个“占位符”命名空间。 和链接器时看到的进口会是这样的:
import examp "path/to/package/example"
//...
func main() {
examp.Bar1()
}
然后它采用$GOPATH/pkg/.../example.a
库文件,并在进口替代阶段的飞行每个""
具有path/to/package/example
。 所以,现在,在链接的程序,我们会看到这样的标志:
T path/to/package/example.Bar1
该“·”字符\xB7
根据我的Javascript控制台。 该“/”字符是\x2215
。
该点落在附件d内C99标准列出了特殊字符,这是在C源标识符有效。 斜杠似乎不是没有,所以我怀疑它用作别的东西(可能命名空间),通过使用#define或预处理魔术。
这可以解释为什么点存在于实际的函数定义,但是斜线不是。
编辑:检查这回答了一些额外的信息。 这有可能是Unicode的斜杠只是GCC的实现允许的。
看来这不是标准的C,也不C99。 特别是,这两个gcc
和clang
抱怨点,甚至在C99模式下。
此源代码是由第9部分编译器套件编译(特别是,./pkg/tool/darwin_amd64/6c在OS X),这是由自举转到建立系统。 根据这个文件 ,第8页,底部计划9和它的编译器不使用ASCII可言,但使用Unicode来代替。 在第9页的底部,但它指出,有足够高的代码点的任何字符被认为是有效的在标识符名称使用。
有没有预处理魔都 - 的函数的定义,只是因为那些是不同的函数不函数的声明相匹配。 例如, void runtime∕race·Initialize();
是一个外部函数,其定义出现在./src/pkg/runtime/race/race.go; 同样为void runtime∕race·MapShadow(…)
出现后,该函数void runtime·raceinit(void)
,是完全不同的功能,这是由它实际调用事实aparant runtime∕race·Initialize();
。
转到编译器/运行时使用原本为的Plan9开发的C语言编译器编译。 当你从源代码编译去,它会先建的Plan9编译器,然后使用这些构建围棋。
该Plan9相关的编译器支持Unicode的函数名[1],转到开发商在它们的功能名称作为伪命名空间中使用Unicode字符。
[1]它看起来像这实际上可能是符合标准: G ++ unicode的变量名 ,但GCC不支持Unicode功能/变量名。