4

GoのC共用体のフィールドにアクセスしたいのですが。以下は私のソースコードですが、コンパイル時にエラーが発生しました:

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]バイトにはフィールドまたはメソッドcがありません)

ユニオンフィールドにアクセスするための正しいアプローチを教えてくれる人はいますか?

4

1 に答える 1

5

型の安全性のために、ユニオンは[N]バイト、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 に答える