Visual Studio:回调函数问题(__cdecl *)

时间:2018-09-17 15:22:28

标签: c visual-studio casting callback

我有一个在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 *);

1 个答案:

答案 0 :(得分:0)

我已经弄清楚了,经过反复试验。

问题在于,VS中的默认调用为__cdecl,并且不能用于回调函数,该回调函数必须为__stdcall

要解决我的问题,我需要将回调函数的签名从以下位置更改: static void send_transfer_finished_cb(struct libusb_transfer *); 至: static void __stdcall send_transfer_finished_cb(struct libusb_transfer *);