2012-09-25 2 views
3

저는 Go에서 C 유니온 필드에 액세스하고 싶습니다. 아래에있는 내 소스 코드이지만, 그것을 컴파일 할 때 나는 오류가 발생했습니다 : 내가 빌드 할 때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 정의되지 않은 (타입 * [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$ 

참고 : 동일한 코드가 다른 엔디안있는 컴퓨터에서 다른 번호를 인쇄 할 것이다.

관련 문제