我不知道这个"功能"叫什么,所以我不能用谷歌搜索它,如果标题没有意义,我也很抱歉.我最近查看了Suckless DWM的源代码,并看到了以下代码:(来自dwm.c)

static int (*xerrorxlib)(Display *, XErrorEvent *);

还有这个:

static void (*handler[LASTEvent]) (XEvent *) = {
    [ButtonPress] = buttonpress,
    [ClientMessage] = clientmessage,
    [ConfigureRequest] = configurerequest,
    [ConfigureNotify] = configurenotify,
    [DestroyNotify] = destroynotify,
    [EnterNotify] = enternotify,
    [Expose] = expose,
    [FocusIn] = focusin,
    [KeyPress] = keypress,
    [KeyRelease] = keypress,
    [MappingNotify] = mappingnotify,
    [MapRequest] = maprequest,
    [MotionNotify] = motionnotify,
    [PropertyNotify] = propertynotify,
    [UnmapNotify] = unmapnotify
};

void (*handler[LASTEvent]) (XEvent *)是什么意思?它叫什么?为什么要用它?

推荐答案

本声明

static int (*xerrorxlib)(Display *, XErrorEvent *);

是指向名为xerrorxlib的函数的指针声明,该函数(该函数)具有返回类型int和指针类型Display *XErrorEvent *的两个参数.

指针具有静态存储持续时间.

本声明

static void (*handler[LASTEvent]) (XEvent *) = {

声明一个名为handler的数组,该数组由LASTEvent个指针元素组成,指向具有返回类型void和参数类型XEvent *的函数.该数组还具有静态存储持续时间.

至于像这样的记录

[ButtonPress] = buttonpress,

然后,在方括号中有被初始化的数组元素的索引.

例如,您可以编写

enum { First = 0, Second = 1 };

然后在如下所示的数组声明中使用带括号的init列表中的枚举数

int a[] =
{
    [First] = 10,
    [Second] = 20
};

在这种情况下,数组将有两个元素,其中索引为0的元素被值10初始化,索引为1的元素被值20初始化.

C++相关问答推荐

C:gcc返回多个错误定义,但msvc—不""'

如何在C中只使用一个带双方括号([i][j])访问语法的malloc来分配动态大小的2d数组?

为什么复合文字(C99)的返回会生成更多的汇编代码?

为什么GCC可以调用未定义的函数?

显式地将值转换为它从函数返回的类型的含义是什么?

如何在C宏中确定 struct 中元素的类型?

C-使用指针返回修改后的整数数组

如何在STM8项目中导入STM8S/A标准外设库(ST VisualDeveloper)?

为什么双精度d=flt_max+flt_max;在c语言中得到inf的结果

从TCP连接启动UDP(C套接字)

为什么函数是按照定义的顺序执行的,而不是按照从avr-c中的int main()调用的顺序执行的?

如何仅使用软件重新初始化STM32微控制器中的USB枚举?

收到不兼容的指针类型警告,因为函数的返回不是空*,而是 struct 指针

CS50 pset 5的皱眉脸正确地处理了大多数基本单词,并且拼写判断不区分大小写.

正在try 理解C++中的`正在释放的指针未被分配‘错误

&stdbool.h&q;在嵌入式系统中的使用

从文件到链表读取日期

Linux memcpy 限制关键字语法

在 C 中传递参数时出现整数溢出

在 C 中的 scanf() 格式说明符中使用宏获取字符串长度