我试图使用cgo为x264库编写一个小包装器,并遇到了嵌套结构的问题。该库使用了许多复杂的结构,其中一些字段本身就是匿名结构。
当尝试使用cgo访问这些结构时,我会遇到编译错误,因为声称嵌套结构不存在。
我设法将问题归结为.h文件和下面粘贴的.go文件。希望这足以说明问题所在。
有没有人知道这个问题的解决方案或解决方法?
感谢。
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;
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}}
}
答案 0 :(得分: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_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
}
当我修改你的程序以正确地refr到嵌套在c
字段中的d
和anon
并取消注释其他语句时,程序编译并运行最后一个语句来打印struct如
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
,以便在遇到问题时查看它产生的内容。
答案 1 :(得分:0)
我不熟悉cgo。但是你不能直接在你的go代码中使用C类型作为cgo重新生成它自己的类型。也许它是_C_param_struct_t。