我有一个在Ubuntu上运行良好的C应用程序,但是我必须将其移植到Visual Studio,这就是问题开始的地方。我正在使用Visual Studio 2017,而我的问题是使用的回调函数。 在代码中,我必须注册两个回调函数(几乎相同的代码,只是一个用于发送数据,另一个用于接收数据)。
libusb_fill_bulk_transfer(recv_transfer_desc, //transfer descriptor struct
usb_dev_handle, //usb device handle
EP1_IN, //unsigned char
in_buffer, //unsigned char*
len, //tranfer length, int
recv_transfer_finished_cb, //callback func
&my_recv_cb_data, //void*, callback user data
timeout); //unsigned int
这会产生以下错误:C2440 'function': cannot convert from 'void (__cdecl *)(libusb_transfer *)' to 'libusb_transfer_cb_fn'
我从不使用VS,所以我真的不知道如何解决此问题。对我来说,它缝起来就像需要将某些东西铸成某种东西,但无法弄清楚。
这是我要处理的回调函数的签名:
static void recv_transfer_finished_cb(struct libusb_transfer *);
答案 0 :(得分:0)
我已经弄清楚了,经过反复试验。
问题在于,VS中的默认调用为__cdecl
,并且不能用于回调函数,该回调函数必须为__stdcall
。
要解决我的问题,我需要将回调函数的签名从以下位置更改:
static void send_transfer_finished_cb(struct libusb_transfer *);
至:
static void __stdcall send_transfer_finished_cb(struct libusb_transfer *);