在C中订阅功能

时间:2014-09-11 09:08:20

标签: c

我看到了这段代码(从设备驱动程序源中提取,更改了变量名称,添加了注释)

下标[]在指向driver_funcs的{​​{1}}静态数组中做了什么?

更重要的是void此处宏的目的是什么?

DECLFUNC

#define DECLFUNC(x) [DRIVER_##x - DRIVER_IOCTL_MIN] f_##x enum { DRIVER_IOCTL_MIN = 300, DRIVER_GET_PARTITION_STATUS = DRIVER_IOCTL_MIN, DRIVER_SET_PARTITION_MODE, DRIVER_GET_PROCESS_ID, //... }; static int f_GET_PARTITION_STATUS( int a, int b, int c ) { //... return 1; } static int f_SET_PARTITION_MODE( int a, int b, int c ) { //... return 2; } static int f_GET_PROCESS_ID( int a, int b, int c ) { //... return 3; } static void *driver_funcs[] = { DECLFUNC(GET_PARTITION_STATUS), //=> [0] f_GET_PARTITION_STATUS, => *(f_GET_PARTITION_STATUS+0) ??? DECLFUNC(SET_PARTITION_MODE), //=> [1] f_SET_PARTITION_MODE, => *(f_SET_PARTITION_MODE+1) ??? DECLFUNC(GET_PROCESS_ID), //=> [2] f_GET_PROCESS_ID, => *(f_GET_PROCESS_ID+2) ??? //.... }; 以正常方式使用

driver_funcs

此代码是使用gcc编译的,如果这很重要(gcc扩展名?)。如果重复,请告诉我,我将删除此帖。功能

1 个答案:

答案 0 :(得分:4)

它是C99标准中的一项功能,能够将项目放置在阵列初始化程序中的任意位置。参见例如this GCC manual page

它的作用是为例如放置一个函数指针。数组中索引为零的GET_PARTITION_STATUS


C99标准规定索引和值之间应该有=,GCC作为语言的扩展允许你省略它。