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

Golang (cgo) - 支持带有 cgo 的嵌套结构吗?

Golang (cgo) - 支持带有 cgo 的嵌套结构吗?

Go
海绵宝宝撒 2021-06-09 13:47:58
我试图使用 cgo 为 x264 库编写一个小包装器,但遇到了嵌套结构的问题。该库使用了许多复杂的结构,其中一些字段本身就是匿名结构。当尝试使用 cgo 访问这些结构时,我遇到了编译错误,因为 go 声称嵌套结构不存在。我设法将问题归结为一个 .h 文件和一个粘贴在下面的 .go 文件。希望这足够清楚以显示问题。有谁知道这个问题的解决方案或解决方法?谢谢。结构体.htypedef struct param_struct_t {  int a;  int b;  struct {    int c;    int d;  } anon;  int e;  struct {    int f;    int g;  } anon2;} param_struct_t;main.gopackage main/*#include "struct.h"*/import "C"import (  "fmt")func main() {  var param C.param_struct_t  fmt.Println(param.a) // Works and should work  fmt.Println(param.b) // Works and should work  fmt.Println(param.c) // Works fine but shouldn't work  fmt.Println(param.d) // Works fine but shouldn't work  // fmt.Println(param.e) // Produces type error: ./main.go:17: param.e undefined (type C.param_struct_t has no field or method e)  // fmt.Println(param.anon) // Produces type error: ./main.go:18: param.anon undefined (type C.param_struct_t has no field or method anon)  // The following shows that the first parameters and the parameters from the  // first anonymous struct gets read properly, but the subsequent things are  // read as seemingly raw bytes.  fmt.Printf("%#v", param) // Prints out: main._Ctype_param_struct_t{a:0, b:0, c:0, d:0, _:[12]uint8{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}
查看完整描述

2 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

你用的是什么版本的Go?使用 Go 1.1.2,cgo 似乎产生了预期的输出。


我运行了go tool cgo main.go,生成的_obj/_cgo_gotypes.go文件包含以下定义:


type _Ctype_param_struct_t _Ctype_struct_param_struct_t


type _Ctype_struct___0 struct {

//line :1

        c       _Ctype_int

//line :1

        d       _Ctype_int

//line :1

}


type _Ctype_struct___1 struct {

//line :1

        f       _Ctype_int

//line :1

        g       _Ctype_int

//line :1

}


type _Ctype_struct_param_struct_t struct {

//line :1

        a       _Ctype_int

//line :1

        b       _Ctype_int

//line :1

        anon    _Ctype_struct___0

//line :1

        e       _Ctype_int

//line :1

        anon2   _Ctype_struct___1

//line :1

}

当我修改你的程序以正确引用c和d嵌套在anon字段中并取消注释其他语句时,程序编译并运行,最终语句将结构打印为。


main._Ctype_param_struct_t{a:0, b:0, anon:main._Ctype_struct___0{c:0, d:0}, e:0, anon2:main._Ctype_struct___1{f:0, g:0}}

如果您使用的是旧版本的 Go,请尝试升级。cgo如果您仍然遇到问题,您也可以像我一样尝试手动运行,看看它会生成什么。


查看完整回答
反对 回复 2021-06-28
  • 2 回答
  • 0 关注
  • 233 浏览
慕课专栏
更多

添加回答

举报

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