我想将libusb.h转换为PureBasic代码,现在我有了这一行:
typedef void (LIBUSB_CALL *libusb_transfer_cb_fn)(struct libusb_transfer *transfer);
这种typedef做了什么?
后来有这样的行:
void LIBUSB_CALL libusb_free_device_list(libusb_device **list, int unref_devices);
提前致谢!
答案 0 :(得分:1)
LIBUSB_CALL只是一种类型注释。它可能没有做任何事情。
这声明了一个类型“f”,它是一个返回void并取“params”的函数指针:
typedef void (*f)(params...)
libusb_transfer_cb_fn是一种表示函数指针的类型,该函数指针指向libusb_transfer结构的指针并且不返回任何内容(void)。
答案 1 :(得分:1)
C中typedef
的语法很奇怪。你做的是写一个普通的声明:
int x, *y, z[2];
然后在前面插入关键字typedef
。这告诉编译器,对于声明的每个变量,实际上并不声明变量;相反,如果变量是变量,则为变量所具有的类型创建一个新名称。所以:
typedef int x, *y, z[2];
使x
为int
的别名,y
为int *
的别名,z
为int [2]
的别名。
如果您从原始行中取出typedef
,则会获得:
void (LIBUSB_CALL *libusb_transfer_cb_fn)(struct libusb_transfer *transfer);
(如果LIBUSB_CALL
是一个宏,它只是语法上有效,可能是一些特定于编译器的修饰符,如__stdcall
或__fastcall
),由于C需要,这已经有点特殊了括号指向函数。但它会声明(并定义)libusb_transfer_cb_fn
作为类型的变量“指向函数的指针接受一个参数(转移事物)并返回void
。所以typedef
使libusb_transfer_cb_fn
该类型的别名。
显然名称(好...... :-))表示:“转移操作后libusb的回调函数”。
这个想法是后来的C代码可能会读取如下内容:
extern libusb_transfer_cb_fn abc_func;
告诉你有一些类型为“指向libusb回调的指针”的全局变量abc_func
,或者:
some_return_type xyz_func(libusb_transfer_cb_fn funcp, int a, char *b) {
struct libusb_transfer x;
... some code that fills in x ...
(*funcp)(&x);
}