我想将 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);
提前致谢!
C 中的 for 语法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是宏时才在语法上有效,可能是一些特定于编译器的修饰符,例如__stdcallor __fastcall),这已经有点奇怪了,因为 C 需要给指向函数的指针加上括号。但它会声明(并定义)libusb_transfer_cb_fn为“指向函数的指针”类型的变量,该函数采用一个参数(传输的东西)并返回void。因此为该类型typedef创建了libusb_transfer_cb_fn一个别名。
这个名字显然(嗯... :-) )的意思是:“传输操作后libusb的回调函数”。
这个想法是稍后的 C 代码可能会读到如下内容:
extern libusb_transfer_cb_fn abc_func;
它告诉你有一些abc_func“指向 libusb 回调的指针”类型的全局变量,或者:
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);
}
LIBUSB_CALL 只是一个类型注释。它可能不会做任何事情。
这声明了一个类型“f”,它是一个返回 void 并采用“params”的函数指针:
typedef void (*f)(params...)
libusb_transfer_cb_fn 是一种表示函数指针的类型,该函数指针跟踪指向 libusb_transfer 结构的指针并且不返回任何内容(void)。