斜线和点函数名和原型?(Slashes and dots in function names and

2019-07-04 00:39发布

我是新的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?

Answer 1:

重要更新:

最终的答案肯定是你从拉斯考克斯得到了一个 ,围棋作家之一,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


Answer 2:

该“·”字符\xB7根据我的Javascript控制台。 该“/”字符是\x2215

该点落在附件d内C99标准列出了特殊字符,这是在C源标识符有效。 斜杠似乎不是没有,所以我怀疑它用作别的东西(可能命名空间),通过使用#define或预处理魔术。

这可以解释为什么点存在于实际的函数定义,但是斜线不是。

编辑:检查这回答了一些额外的信息。 这有可能是Unicode的斜杠只是GCC的实现允许的。



Answer 3:

看来这不是标准的C,也不C99。 特别是,这两个gccclang抱怨点,甚至在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();



Answer 4:

转到编译器/运行时使用原本为的Plan9开发的C语言编译器编译。 当你从源代码编译去,它会先建的Plan9编译器,然后使用这些构建围棋。

该Plan9相关的编译器支持Unicode的函数名[1],转到开发商在它们的功能名称作为伪命名空间中使用Unicode字符。

[1]它看起来像这实际上可能是符合标准: G ++ unicode的变量名 ,但GCC不支持Unicode功能/变量名。



文章来源: Slashes and dots in function names and prototypes?
标签: c go notation