[英]libusb callback_in function as a member of a class in C++
當在C ++中作為類的成員調用時,我在libusb_fill_bulk_transfer
定義和使用回調函數時libusb_fill_bulk_transfer
問題。
這是類中的定義:
namespace usb_connector
{
class USBConnector
{
public:
USBConnector();
~USBConnector();
int connect(void);
void read(void);
void write(unsigned char *);
void disconnect(void);
void LIBUSB_CALL callback_in(struct libusb_transfer*);
...
這是類中的實現:
void LIBUSB_CALL usb_connector::USBConnector::callback_in(struct libusb_transfer *transfer)
{
if (transfer == NULL) {
cout << "No libusb_transfer..." << endl;
}
else {
cout << "libusb_transfer structure: " << endl;
cout << "actual_length = " << transfer->actual_length << endl;
for (int i = 0; i < transfer->actual_length; i++) {
cout << transfer->buffer[i];
}
cout << endl;
}
return;
}
以下是我稱之為:
...
...
libusb_fill_bulk_transfer( transfer_in, usb_dev, USB_ENDPOINT_IN,
in_buffer, LEN_IN_BUFFER, callback_in, NULL, 0);
...
...
我得到的錯誤如下:
錯誤:無法將'usb_connector :: USBConnector :: callback_in'從類型'void(usb_connector :: USBConnector ::)(libusb_transfer *)'轉換為'libusb_transfer_cb_fn {aka void( )(libusb_transfer )}'in_buffer,LEN_IN_BUFFER,callback_in, NULL,0);
如何將回調函數作為類的成員以及如何調用它?
指向類成員函數的指針和指向函數的指針在C ++中是不兼容的。
根據文檔,回調的原型是:
typedef void( * libusb_transfer_cb_fn) (struct libusb_transfer *transfer)
而struct libusb_transfer
有user_data
字段,顯然在你設置回調期間填寫,所以你需要一個包裝器:
void LIBUSB_CALL callback_wrapper(struct libusb_transfer *transfer)
{
usb_connector::USBConnector *connector = reinterpret_cast<usb_connector::USBConnector*>(transfer->user_data);
connector->callback_in(transfer);
}
並通過this
通話過程中:
...
...
libusb_fill_bulk_transfer( transfer_in, usb_dev, USB_ENDPOINT_IN,
in_buffer, LEN_IN_BUFFER, callback_wrapper, this, 0);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.