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

如何使用来自不同包的相同 C 类型?

如何使用来自不同包的相同 C 类型?

Go
慕村225694 2023-06-05 18:33:52
我正在尝试使用 cairo 绑定(Go 包),它定义了一个包装结构,其中包含 C 类型和 C 函数,但无法使其工作。cairo 包定义了一个上下文:package cairo...type Context struct {    Ptr *C.cairo_t}...然后,从主包中,我想使用它的指针:package main...cr := cairo.Create(surf.Surface)layout := C.pango_cairo_create_layout(cr.Ptr)...accepts ,这是应该的C.pango_cairo_create_layout。但是,go 编译器不同意:*C.cairo_tcr.Ptr./main.go:114:157: cannot use cr.Ptr (type *cairo._Ctype_struct__cairo) as type *_Ctype_struct__cairo in argument to func literal可以看出,cr.Ptr是类型*cairo.C.cairo_t而不是*C.cairo_t类型,即包命名空间是类型的一部分。我找到了https://github.com/golang/go/issues/13467,它讨论了使用 reflect 包和unsafe.Pointer. 但是,我无法让它工作。我如何正确地“弯曲”它以便它编译和工作?
查看完整描述

1 回答

?
守候你守候我

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

对于那些感兴趣的人,我已经弄明白了。


package main

...

cr := cairo.Create(surf.Surface)

ptr := (*C.cairo_t)(unsafe.Pointer(reflect.ValueOf(cr.Ptr).Pointer()))

layout := C.pango_cairo_create_layout(ptr)

...

也许可以更简单地完成,但这很有效。


查看完整回答
反对 回复 2023-06-05
  • 1 回答
  • 0 关注
  • 90 浏览
慕课专栏
更多

添加回答

举报

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