Что такое тип cgo, эквивалентный константному указателю на структуру?
У меня внешняя функция удалена C
:
//extern void goCallback(const struct libvlc_event_t*, void*);
Быть определенным в go
:
//export goCallback
func goCallback(event unsafe.Pointer, userData unsafe.Pointer) {
log.Fatal("TODO goCallback")
}
При компиляции кода я получаю конфликтующие ошибки типа
# github.com/tarrsalah/libvlc-go
In file included from $WORK/github.com/tarrsalah/libvlc-go/_obj/_cgo_export.c:3:0:
cgo-gcc-export-header-prolog:42:13: error: conflicting types for ‘goCallback’
In file included from $WORK/github.com/tarrsalah/libvlc-go/_obj/_cgo_export.c:3:0:
../../../tarrsalah/libvlc-go/event_manager.go:6:13: note: previous declaration of ‘goCallback’ was here
//extern void goCallback(const struct libvlc_event_t*, void*);
^~~~~~~~~~
/tmp/go-build855229382/github.com/tarrsalah/libvlc-go/_obj/_cgo_export.c:17:6: error: conflicting types for ‘goCallback’
void goCallback(void* p0, void* p1)
^~~~~~~~~~
In file included from $WORK/github.com/tarrsalah/libvlc-go/_obj/_cgo_export.c:3:0:
../../../tarrsalah/libvlc-go/event_manager.go:6:13: note: previous declaration of ‘goCallback’ was here
//extern void goCallback(const struct libvlc_event_t*, void*);
^~~~~~~~~~
Что go
эквивалентно const struct libvlc_event_t*
?
1 ответ
Решение
Создайте псевдоним типа для структуры с typedef
следующее:
/*
typedef const struct libvlc_event_t clibvlc_event_t;
extern void goCallback(clibvlc_event_t*, void*);
*/
import "C"
//export goCallback
func goCallback(event *C.clibvlc_event_t, userData unsafe.Pointer) {
log.Fatal("TODO goCallback")
}
Если вы хотите знать go
определение типа, которое совместимо с C.clibvlc_event_t
, бежать cgo
с -godefs
варианты, т.е.
go tool cgo -godefs <YOUR-GO-FILE>
Например, если структура определена как в https://docs.libreoffice.org/avmedia/html/Types_8hxx_source.html
struct libvlc_event_t
{
int type; // event type
void *p_obj; // object emitting that event
union // so far we don't need this.
{
struct {
const char *dummy1;
const char *dummy2;
} padding;
} u;
};
затем совместимая структура в go
будет:
type VLCEvent struct {
Type int32
Pad_cgo_0 [4]byte
Obj *byte
U [16]byte
}
//Cast C struct to Go struct
ev := (*VLCEvent)(unsafe.Pointer(event))
//Cast Go struct to C struct
p := (*C.clibvlc_event_t)(unsafe.Pointer(&VLCEvent{}))
РЕДАКТИРОВАТЬ:
Добавить пример структуры.