18

我是 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吗?

4

4 回答 4

19
于 2012-11-21T10:07:18.993 回答
8

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

该点位于C99 标准的附录 D中,列出了哪些特殊字符在 C 源代码中可用作标识符。斜线似乎没有,所以我怀疑它通过#define 或预处理器魔术被用作其他东西(也许是命名空间)。

这可以解释为什么在实际的函数定义中存在点,而斜线却没有。

编辑:检查此答案以获取更多信息。GCC 的实现可能只允许使用 unicode 斜杠。

于 2012-11-20T15:07:22.107 回答
5

看来这不是标准 C,也不是 C99。特别是,即使在 C99 模式下,它gcc也会clang抱怨点。

此源代码由第 9 部分编译器套件(特别是 OS X 上的 ./pkg/tool/darwin_amd64/6c)编译,该套件由 Go 构建系统引导。根据this document,第8页底部,Plan 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-20T17:03:03.410 回答
3

go 编译器/运行时是使用最初为 plan9 开发的 C 编译器编译的。当你从源代码构建 go 时,它会首先构建 plan9 编译器,然后使用它们来构建 Go。

plan9 编译器支持 unicode 函数名 [1],Go 开发人员在其函数名中使用 unicode 字符作为伪命名空间。

[1] 看起来这实际上可能符合标准:g++ unicode variable name but gcc does not support unicode function/variable names。

于 2012-11-21T02:56:34.150 回答