为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 cgo 导出函数中获取正确的参数名称?

如何在 cgo 导出函数中获取正确的参数名称?

Go
繁华开满天机 2023-07-10 17:58:05
我正在用 Go 编写一个库,我想将其导出到 c 共享库。p0它工作得很好,但是我发现导出的标头使用, p1, p2,...作为参数名称而不是 Go 中的原始参数名称有点烦人。有没有办法改变这种行为,或者我只是坚持这样做?我在用go version go1.12.7 darwin/amd64例子:package main/*#import <stdlib.h>*/import "C"import (    "fmt")func main() {}//export MyFuncfunc MyFunc(input *C.char) {    fmt.Println(C.GoString(input));}go build -o libout.so -buildmode=c-shared输出:extern void MyFunc(char* p0);为什么没有p0点名input?Go 函数可以通过以下方式导出以供 C 代码使用://export MyFunctionfunc MyFunction(arg1, arg2 int, arg3 string) int64 {...}//export MyFunction2func MyFunction2(arg1, arg2 int, arg3 string) (int64, *C.char) {...}它们在 C 代码中的形式如下:extern int64 MyFunction(int arg1, int arg2, GoString arg3);extern struct MyFunction2_return MyFunction2(int arg1, int arg2, GoString arg3);然而,当我编译它给出的确切代码时,我得到这个结果:extern GoInt64 MyFunction(GoInt p0, GoInt p1, GoString p2);extern struct MyFunction2_return MyFunction2(GoInt p0, GoInt p1, GoString p2);为什么参数没有名字?
查看完整描述

1 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

Go 允许任意符文名称,例如,input您可以调用变量π。C 不允许这样的名称。大概cgo的作者不想限制你的名字,所以他们只是重命名了所有的东西。

奇怪的是,文档暗示生成的代码将使用您的名字。如果它确实这样做了,那就太好了,前提是你的名字是可行的。


查看完整回答
反对 回复 2023-07-10
  • 1 回答
  • 0 关注
  • 84 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信