2012-09-25 63 views
3

我想訪問Go中的C union字段。下面是我的源代碼,但是當編譯它我得到一個錯誤:訪問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未定義(類型* [8]字節不具有字段或方法c)

誰能告訴我訪問工會領域的正確方法?

回答

4

似乎爲了類型安全,工會被視爲最大聯合項目的[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) [email protected]:~/src/tmp/union$ go build && ./union 
513 
&[1 2 0 0 0 0 0 0] 
(11:28) [email protected]:~/src/tmp/union$ 

注:相同的代碼將在一臺機器打印不同數量與其他字節順序。