有人可以从libusb解释我这个typedef吗?

时间:2013-06-12 21:11:04

标签: c typedef

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

提前致谢!

2 个答案:

答案 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];

使xint的别名,yint *的别名,zint [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);
}