gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:28:06 28 4
gpt4 key购买 nike

我试图使用 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}}
}

最佳答案

您使用的是哪个版本的 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
}

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

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 以查看它生成的内容。

关于c - Golang (cgo) - 支持带有 cgo 的嵌套结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18866462/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com