cgo如何在c中表示go类型?

时间:2015-10-20 00:31:27

标签: go cgo

当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的头文件,所以我可以包含那些类型。

1 个答案:

答案 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编译的代码中定义,但在大多数情况下我所说的都是。