4

我想访问 Go 中的 C union 字段。以下是我的源代码,但编译时出现错误:

package main

// #include <stdio.h>
// #include <stdlib.h>
// union bar {
//        char   c;
//        int    i;
//        double d;
// };
import "C"

import "fmt"

func main() {
    var b *C.union_bar = new(C.union_bar)
    b.c = 4
    fmt.Println(b)
}

当我构建时,出现如下错误:

bc undefined(类型 *[8]byte 没有字段或方法 c)

谁能告诉我访问联合字段的正确方法?

4

1 回答 1

5

为了类型安全,似乎联合被视为 [N]byte, N == 最大联合项的大小。因此,在这种情况下,有必要将“可见”类型处理为 [8] 字节。然后它似乎工作:

package main

/*

#include <stdio.h>
#include <stdlib.h>
union bar {
       char   c;
       int    i;
       double d;
} bar;

void foo(union bar *b) {
    printf("%i\n", b->i);
};

*/
import "C"

import "fmt"

func main() {
    b := new(C.union_bar)
    b[0] = 1
    b[1] = 2
    C.foo(b)
    fmt.Println(b)
}

(11:28) jnml@celsius:~/src/tmp/union$ go build && ./union
513
&[1 2 0 0 0 0 0 0]
(11:28) jnml@celsius:~/src/tmp/union$ 

注意:相同的代码将在具有其他字节序的机器上打印不同的数字。

于 2012-09-25T09:33:40.530 回答