我看到了这段代码(从设备驱动程序源中提取,更改了变量名称,添加了注释)
下标[]在指向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扩展名?)。如果重复,请告诉我,我将删除此帖。功能
答案 0 :(得分:4)
它是C99标准中的一项功能,能够将项目放置在阵列初始化程序中的任意位置。参见例如this GCC manual page
它的作用是为例如放置一个函数指针。数组中索引为零的GET_PARTITION_STATUS
。
C99标准规定索引和值之间应该有=
,GCC作为语言的扩展允许你省略它。