英文:
What is the cgo type equivalent to a const pointer to a struct?
问题
我在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*
等效的是什么?
英文:
I have an extern function decalred in C
:
//extern void goCallback(const struct libvlc_event_t*, void*);
To be defined in go
:
//export goCallback
func goCallback(event unsafe.Pointer, userData unsafe.Pointer) {
log.Fatal("TODO goCallback")
}
When compiling the code, I get type conflicting errors
# 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*);
^~~~~~~~~~
What is the go
equivalent to const struct libvlc_event_t*
?
答案1
得分: 2
创建一个使用typedef
的结构体类型别名,如下所示:
typedef const struct libvlc_event_t clibvlc_event_t;
extern void goCallback(clibvlc_event_t*, void*);
导入"C"包
//导出goCallback
func goCallback(event *C.clibvlc_event_t, userData unsafe.Pointer) {
log.Fatal("TODO goCallback")
}
如果你想知道与C.clibvlc_event_t
兼容的go
类型定义,可以使用-godefs
选项运行cgo
,例如:
go tool cgo -godefs <YOUR-GO-FILE>
例如,如果结构体定义如下所示:https://docs.libreoffice.org/avmedia/html/Types_8hxx_source.html
struct libvlc_event_t
{
int type; // 事件类型
void *p_obj; // 发出该事件的对象
union // 目前我们不需要这个。
{
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
}
//将C结构体转换为Go结构体
ev := (*VLCEvent)(unsafe.Pointer(event))
//将Go结构体转换为C结构体
p := (*C.clibvlc_event_t)(unsafe.Pointer(&VLCEvent{}))
编辑:
添加示例结构体。
英文:
Create type alias to the struct with typedef
as follows:
/*
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")
}
If you want to know go
type definition which is compatible to C.clibvlc_event_t
, run cgo
with -godefs
options, i.e.
go tool cgo -godefs <YOUR-GO-FILE>
For example, if the struct is defined as in 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;
};
then, the compatible struct in go
will be:
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{}))
EDIT:
Add example struct.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论