猿问

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

当将 go func 导出到 c 时,接口类型 port 为 GoInterface,int 为 GoInt。如何移植我的 c 函数以使用这些类型?



void *SomeFunc(GoInterface arg);

交流电


void *SomeFunc(GoInterface arg) {

}


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 的 go 头文件用于 java,所以我可以包含这些类型。


犯罪嫌疑人X
浏览 175回答 1
1回答

白猪掌柜的

不,Go 没有任何方法可以将类型导出为“C 可读”。此外,您不能从 C 中引用 Go 结构,并且尝试将 C 结构“看起来像”Go 结构是不安全的,因为您无法控制内存布局。执行此操作的“正确”方法是在 C 文件中创建一个类型并将其添加为 Go 结构中的字段:// from Ctypedef struct x {    // fields} x;// From Go, include your .h file that defines this type.type X struct {   c C.x}然后以这种方式对您的类型进行操作,并传入C.x您所有的 C 函数而不是x.还有其他几种方法(例如,在您想将其用作一种或另一种时在它们之间进行转换),但从模糊的一般意义上来说,这是最好的。编辑:一些 Go 类型可以用 C 表示,例如,int64将在通过 cgo 编译的代码中定义,但在大多数情况下,我所说的都是成立的。
随时随地看视频慕课网APP

相关分类

Go
我要回答