Go 的 C 源代码中函数名称和原型中的斜线和点
Go 的 C 源代码,如 race.c 文件所示,合并了非标准字符的使用,引发了对其有效性的质疑。
C 标准的扩展
用于 Go 的 C 编译器,植根于 Plan 9 C 编译器,通过支持标识符中的 UTF-8 字符扩展了标准。一个值得注意的扩展是对中点字符 (·) 的特殊处理。
中点和命名空间分离
中点在 Go 的内部链接过程中充当命名空间分隔符。当编译具有 UTF-8 标识符的 C 文件时,中点将转换为目标文件中的点 (.)。 Go 链接器将此点解释为名称空间分隔符。
示例
考虑以下以 UTF-8 编写的不带 BOM 的 C 代码:
<code class="c">void ·Bar1() {} void foo·bar2() {} void foo∕baz·bar3() {}</code>
编译此代码会生成以下符号:
$ go tool 8c example.c $ go tool nm example.8 T "".Bar1 T foo.bar2 T foo∕baz.bar3
请注意,“”Bar1() 有一个大写的 B,使其对 Go 代码可见。就结果符号而言,它相当于 Go 函数“func Bar1() {}”。
“空”命名空间
“”命名空间是用作占位符的特殊命名空间。使用此命名空间导入包时,如:
<code class="go">import examp "path/to/package/example" func main() { examp.Bar1() }</code>
链接器在导入过程中将“”替换为实际的包路径。因此,在链接的二进制文件中,我们将找到以下符号:
T path/to/package/example.Bar1
结论
Go 的 C 源代码中的斜杠和中点扩展了标准,提供了命名空间和区分函数名称的方式。此约定有助于构建和链接 Go 应用程序。
以上是Go 的 C 源代码中的斜杠和中点如何有助于函数命名空间和链接?的详细内容。更多信息请关注PHP中文网其他相关文章!