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

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

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

Go
犯罪嫌疑人X 2021-11-15 20:31:15
当将 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,所以我可以包含这些类型。
查看完整描述

1 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

不,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.


还有其他几种方法(例如,在您想将其用作一种或另一种时在它们之间进行转换),但从模糊的一般意义上来说,这是最好的。


编辑:一些 Go 类型可以用 C 表示,例如,int64将在通过 cgo 编译的代码中定义,但在大多数情况下,我所说的都是成立的。


查看完整回答
反对 回复 2021-11-15
  • 1 回答
  • 0 关注
  • 174 浏览
慕课专栏
更多

添加回答

举报

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