簡體   English   中英

難以訪問 go 中的嵌套 C 聯合成員

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM