0

我想将 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);

提前致谢!

4

2 回答 2

1

C 中的 for 语法typedef很奇特。你要做的是写一个普通的声明:

int x, *y, z[2];

然后typedef在前面插入关键字。这告诉编译器,对于每个声明的变量,实际上并没有声明一个变量;相反,如果它是一个变量,则为该变量将具有的类型取一个新名称。所以:

typedef int x, *y, z[2];

为的x别名inty为 的别名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);
}
于 2013-06-12T21:25:34.237 回答
1

LIBUSB_CALL 只是一个类型注释。它可能不会做任何事情。

这声明了一个类型“f”,它是一个返回 void 并采用“params”的函数指针:

typedef void (*f)(params...)

libusb_transfer_cb_fn 是一种表示函数指针的类型,该函数指针跟踪指向 libusb_transfer 结构的指针并且不返回任何内容(void)。

于 2013-06-12T21:14:03.510 回答