我正在Go中编写一个库,我想将其导出到C共享库。它工作得很好,但是我觉得有点讨厌导出的标题上使用p0,p1,p2,...为参数的名称,而不是从转到原来的参数名称。有没有办法改变这种行为,还是我只是坚持下去?
p0
p1
p2
...
我在用 go version go1.12.7 darwin/amd64
go version go1.12.7 darwin/amd64
例:
package main /* #import <stdlib.h> */ import "C" import ( "fmt" ) func main() {} //export MyFunc func MyFunc(input *C.char) { fmt.Println(C.GoString(input)); } go build -o libout.so -buildmode=c-shared
输出:
extern void MyFunc(char* p0);
为什么不p0命名input?
input
根据此cgo文档,我应该获取变量名。
它指出
Go函数可以通过以下方式导出以供C代码使用: //export MyFunction func MyFunction(arg1, arg2 int, arg3 string) int64 {...} //export MyFunction2 func 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);
Go函数可以通过以下方式导出以供C代码使用:
//export MyFunction func MyFunction(arg1, arg2 int, arg3 string) int64 {...} //export MyFunction2 func 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);
为什么参数没有名称?
Go允许使用任意符文名称,例如,而不是input您可以调用变量π。C不允许这样的名称。大概是cgo的作者不想限制您的名字,因此他们只是重命名了所有内容。
π
奇怪的是,文档暗示生成的代码将使用您的姓名。如果您的名字可行的话,这样做就很好了。