[英]Difficulty accessing nested C union member in go
免責聲明:我是 Go/CGo 的新手。
我正在 64 位平台上使用這個 C 結構,試圖訪問聯合的 uint32 成員
typedef enum {
n = 0,
ix = 1,
iy = 3
} enum_x;
struct smallStruct_s {
union {
uint32 a[4];
uint32 b[8];
uint32 c[16];
} u;
} smallStruct_t;
struct bigStruct_s {
enum_x fa;
union {
uint32 member_to_access; <<<<<< This is member that needs to be accessed
smallStruct_t an;
} un_t;
} bigStruct_t;
鑒於我可以訪問bigStruct_t
可以使用C.bigStruct_t
訪問,我在 Go 中訪問/ member_to_access
時遇到困難。
如何使用unsafe.Pointer
將 member_to_access 的地址傳遞給 function ,它在 C 中接受 void* 而不會違反任何 ZCD69B4957F06CD818D7BF3D61980E291 約束。
機器是小端
我嘗試使用 Golang CGo 中提到的 byteArray 和 C 緩沖區:將聯合字段轉換為 Go 類型,但不明白為什么 ZC1C425268E68385D1AB5074C17A94F14 的參數大小為字節數組。
聯合可以表示為字節數組,因此該字段的權重為最大元素的大小([sizeof_union's_largest_element]byte)。 枚舉可以表示為 int。
我建議為此使用偏移量:
type bigStruct struct {
instance unsafe.Pointer
}
func (bs *bigStruct) fa() int {
return int(*(*C.int)(bs.instance))
}
func (bs *bigStruct) memberToAccess() uint32 {
// C.sizeof_int refers to sizeof(enum_x)
return uint32(*(*C.uint32_t)(unsafe.Pointer(uintptr(bs.instance) + C.sizeof_int)))
}
func (bs *bigStruct) an() *C.smallStruct_t {
return (*C.smallStruct_t)(unsafe.Pointer(uintptr(bs.instance) + C.sizeof_int))
}
func (bs *bigStruct) an_u() []byte {
// cgo having same thought about and takes smallStruct_t.u as array
return (*C.smallStruct_t)(unsafe.Pointer(uintptr(bs.instance) + C.sizeof_int)).u[:]
}
func (bs *bigStruct) next_field_after_un_t() *Type {
return (*Type)(unsafe.Pointer(uintptr(bs.instance) + C.sizeof_int + C.sizeof_smallStruct_t))
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.