2016-06-08 2 views
2

Предположим, у меня есть библиотека C с кодом вроде этого:функция Pass Перейти к С, как обратный вызов

typedef int (callback_t)(int); 
void register_callback(callback_t cb); 

Я хочу написать идти привязок для этой функции и передавать произвольные идут обратные вызовы.

Я нашел отличный ответ here. Тем не менее, это трюк, который использует тот факт, что обратный вызов принимает void *, через который Go передает указатель функции на C и получает его обратно. Однако это не может быть применено в моем примере, так как нет пользователя void *.

Лучшее, что я мог сделать, это:

/* 
extern int gobridge(int data); 

static int cbridge(void) 
{ 
    register_callback(gobridge); 
} 
*/ 
import "C" 

type Callback func (int) int 

var g_cb Callback 

//export gobridge 
func gobridge(data C.int) C.int { 
    return C.int(g_cb(int(data))) 
} 

func RegisterCallback(cb Callback) { 
    g_cb = cb //save callback in a global 
    C.cbridge() 
} 

func Count(left, right int) { 
    C.count(C.int(left), C.int(right)) 
} 

Это работает только для одного register_callback (из-за глобальной переменной), но библиотека C может зарегистрировать много обратных вызовов и вызвать их всех.

Я надеялся добиться чего-то вроде этого, но это не компилируется (отложил Clojure, он не может преобразовать функцию идти к с функцией, даже если подпись та же):

import "C" 

func RegisterCallback(cb Callback) { 
    f := func (d C.int) C.int { 
     return C.int(cb(int(d))) 
    } 
    C.register_callback(f) 
} 

func Count(left, right int) { 
    C.count(C.int(left), C.int(right)) 
} 

Есть ли способ правильно связать библиотеку C?

+0

Вы читали https://github.com/golang/go/wiki/cgo? Там есть несколько примеров. – JimB

+0

@JimB, не удалось найти ни одного подходящего примера, можете ли вы указать на один? – kaspersky

ответ

0

Вы можете создать массив обратных вызовов и провести мостовой переход по массиву обратных вызовов, если нет возвращаемого значения (функция void).

 Смежные вопросы

  • Нет связанных вопросов^_^