2015-10-05 78 views
1

我在C庫中有一個結構,裏面定義了一些回調。問題去對待這個領域*[0]byte數組類型,我不能將其設置爲指針:Cgo:無法在C結構中設置回調

./test.go:16: cannot use _Cgo_ptr(_Cfpvar_fp_cb_func) (type unsafe.Pointer) as type *[0]byte in assignment 

的問題代碼示例:

package main 

/* 
void cb_func(); 
typedef struct cb_s { 
    void (*cb_f)(); 
} cb_s; 
*/ 
import "C" 

//export cb_func 
func cb_func() {} 

func main() { 
     var x C.struct_cb_s 
     // here I want to set callback cb_f to pointer of cb_func(). 
     x.cb_f = C.cb_func 
} 

一個可能的解決方案 - 寫一個C二傳手,像這樣的:

​​

,但它看起來醜陋:我不能通過cb_func作爲參數傳遞給二傳手(已經嘗試過cb_set(cb_s *s, void(*func)()),但有大約* [0]字節相同的錯誤)和甲肝e許多類似的回調,因此需要爲每對回調函數編寫setter。

其他解決方案?

回答

1

這就是你如何去做的,是的,它很醜。不要忘記將extern void cb_func(void);添加到您的c代碼中。

我結束了與此:

/* 
typedef struct { 
    void (*cb_f)(); 
} cb_s; 

extern void cb_func(void); 

static void cb_set(cb_s *s) { 
    s->cb_f = &cb_func; 
} 
*/ 
import "C" 

//export cb_func 
func cb_func() {} 

func main() { 
    var x C.cb_s 
    // here I want to set callback cb_f to pointer of cb_func(). 
    C.cb_set(&x) 
} 
+0

我已經有差不多有問題注意相同的代碼,但在不同的* .c文件代替c包裝,以消除雙重編譯。不管怎麼說,還是要謝謝你。 將等待任何其他解決方案,我希望它存在。 – sisoft

+0

是否有其他解決方案? –