2015-02-04 5 views
1

Также протестирована с -Wall и -std = C99 и C11 (не работает, конечно)libusb-1.0 libusb_get_device_list() недостаточность

$ gcc -o usb -L/usr/local/lib -lusb-1.0 -I/usr/local/include usbtest.c 

Выход:

usbtest.c: In function ‘main’: 
usbtest.c:14:1: error: label ‘brd_ftdi’ used but not defined 
libusb_get_device_list(context, &&brd_ftdi); 

usbtest.c:

#include <stdio.h> 
#include <libusb-1.0/libusb.h> 
int main() { 
    libusb_device* brd_ftdi; 
    libusb_device_handle** brd_ftdi_handle; 
    libusb_context* context; 

    //libusb_device *** list = &&brd_ftdi; 

    //libusb_init (libusb_context **); 
    libusb_init (&context); 

    libusb_get_device_list(context, &&brd_ftdi); 
    //libusb_open(brd_ftdi, brd_ftdi_handle); 

    //libusb_exit(struct libusb_context *); 
    libusb_exit(context); 

    return 0; 
} 

Не определено? Я знаю, но libusb_get_device_list() должен это сделать (поставьте там список), поэтому WTF? Я также протестировал объявление указателя на указатель на brd_ftdi и передачу этого вместо того же результата.

ответ

1

Если вы внимательно прочитали сообщение об ошибке, то указано, что метка brd_ftdi не определена, а не переменная.

Это потому, что вы написали &&brd_ftdi, && является расширением GCC, что означает the address of a label. Он не является стандартным C.

Адрес переменной всего один &. Адрес переменной brd_ftdi: &brd_ftdi.

Функция libusb_get_device_list принимает libusb_device***: адрес, на котором он напишет адрес перечня указателей на libusb_device. Вы можете использовать его как это:

libusb_device **list_of_devices; 
libusb_get_device_list(context, &list_of_devices); 

list_of_devices является указателем на первый указатель списка (указателей на libusb_device с).

У вас будет проблема с вашим прокомментированным звонком на звонок libusb_open, так как вы передаете неинициализированный указатель на указатель на libusb_device_handle. Эта функция также записывает свой результат (libusb_device_handle *) по указанному вами адресу.

Смежные вопросы