我是个C新手,在查看Go的源码树时,我发现了这个:
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吗?
发布于 2012-11-21 01:03:03
这似乎不是标准的C,也不是C99。特别是,即使在C99模式下,它的gcc
和clang
都会抱怨点。
这段源代码是由Part 9编译器套件(特别是OS X上的./pkg/tool/darwin_amd64/6c )编译的,它是由Go构建系统引导的。根据this document的说法,在第8页的底部,9计划及其编译器根本不使用ASCII码,而是使用Unicode。在第9页的底部,它指出,任何具有足够高的码位的字符都被认为是有效的,可以在标识符名称中使用。
根本没有预处理的魔力-函数的定义与函数的声明不匹配,只是因为它们是不同的函数。例如,void runtime∕race·Initialize();
是一个外部函数,其定义出现在./src/pkg/runtime/race/race.go中;对于void runtime∕race·MapShadow(…)
也是如此。
后面出现的函数void runtime·raceinit(void)
是一个完全不同的函数,因为它实际上调用了runtime∕race·Initialize();
。
发布于 2012-11-21 10:56:34
go编译器/运行时是使用最初为plan9开发的C编译器编译的。当您从源代码构建Go时,它将首先构建plan9编译器,然后使用这些编译器构建go。
plan9编译器支持unicode函数名1,Go开发人员在其函数名中使用unicode字符作为伪命名空间。
1看起来这实际上可能是符合标准的:g++ unicode variable name,但gcc不支持unicode函数/变量名。
https://stackoverflow.com/questions/13475908
复制相似问题