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

我试图使用 cgo 为 x264 库编写一个小包装器,但遇到了嵌套结构的问题。该库使用了许多复杂的结构,其中一些字段本身就是匿名结构。


当尝试使用 cgo 访问这些结构时,我遇到了编译错误,因为 go 声称嵌套结构不存在。


我设法将问题归结为一个 .h 文件和一个粘贴在下面的 .go 文件。希望这足够清楚以显示问题。


有谁知道这个问题的解决方案或解决方法?


谢谢。


结构体.h

typedef 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.go

package 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}}

}


海绵宝宝撒
浏览 234回答 2
2回答

一只甜甜圈

你用的是什么版本的Go?使用 Go 1.1.2,cgo 似乎产生了预期的输出。我运行了go tool cgo main.go,生成的_obj/_cgo_gotypes.go文件包含以下定义:type _Ctype_param_struct_t _Ctype_struct_param_struct_ttype _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如果您仍然遇到问题,您也可以像我一样尝试手动运行,看看它会生成什么。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go