当export func到c时,接口类型端口为GoInterface,int为GoInt。如何移植我的c函数以使用这些类型?
A.H
void *SomeFunc(GoInterface arg);
交流转换器
void *SomeFunc(GoInterface arg) {
}
a.go
package main
// #include "a.h"
import "C"
type A struct {
}
func main() {
var a = new(A)
}
当我去构建时:
cc errors for preamble:
In file included from ./a.go:3:0:
a.h:1:16: error: unknown type name 'GoInterface'
void *SomeFunc(GoInterface arg)
是否有一个像jni.h for java的头文件,所以我可以包含那些类型。
答案 0 :(得分:2)
不,Go没有办法将类型导出为" C可读"。此外,你不能从C中引用Go结构,并且尝试将C结构赋予"看起来像"是不安全的。一个Go结构,因为你无法控制内存布局。
"对"这样做的方法是在C文件中创建一个类型,并将其作为Go结构中的字段添加:
// from C
typedef struct x {
// fields
} x;
// From Go, include your .h file that defines this type.
type X struct {
c C.x
}
然后以这种方式操作您的类型,并将C.x
传递到所有C函数而不是x
。
还有其他一些方法,(例如,在你想要将它们作为一种或另一种方式使用时,在它们之间进行转换),但这种方法在一般意义上是最好的。
编辑:一个FEW Go类型可以用C表示,例如,int64
将在通过cgo编译的代码中定义,但在大多数情况下我所说的都是。