Используйте transfer->user_data
.Из структуры libusb_transfer doc :
Поля данных
void * user_data
Данные контекста пользователя для передачи в функцию обратного вызова.
Я не знаю, какой тип pairing
, но это выглядело бы так:
int main() {
...
struct pairing_type_s *pairing = pairing_init();
...
libusb_fill_interrupt_transfer(pairing->transfer, dctx->devh, 0x84, pairing->buffer,
sizeof(pairing->buffer), cb_aknowledgement, pairing, 0);
...
}
// Then later:
static void cb_aknowledgement(struct libusb_transfer *transfer)
{
assert(transfer != NULL);
struct pairing_type_s *pairing = transfer->user_data;
assert(pairing != NULL);
// use pairing like a pro
...
}
Но вы также можете быть более профессионалом, если вы убедитесь, чтоВы всегда вызываете libusb_fill_interrupt_transfer
с pairing->transfer
с cb_aknowledgement
и используете макрос container_of
:
int main() {
...
struct pairing_type_s *pairing = pairing_init();
...
libusb_fill_interrupt_transfer(pairing->transfer, dctx->devh, 0x84, pairing->buffer,
sizeof(pairing->buffer), cb_aknowledgement, NULL, 0);
...
}
// Then later:
static void cb_aknowledgement(struct libusb_transfer *transfer)
{
assert(transfer != NULL);
struct pairing_type_s *pairing = container_of(transfer, struct pairing_type_s, transfer);
assert(pairing != NULL);
// use pairing like a pro
...
}
Но я бы предпочел первый метод в этом случае, так как он более читабелен и более безошибочен.