MST

星途 面试题库

面试题:C语言函数指针与回调机制在事件驱动编程中的应用

假设你正在开发一个简单的图形用户界面(GUI)系统,其中有按钮、文本框等组件。当用户点击按钮时,需要执行特定的操作。请使用C语言的函数指针和回调机制来设计一个简单的框架,实现按钮点击事件的处理,要求清晰地展示回调函数的注册、触发等过程。
22.3万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>

// 定义回调函数类型
typedef void (*ButtonCallback)(void);

// 按钮结构体
typedef struct {
    char *label;
    ButtonCallback callback;
} Button;

// 注册回调函数
void registerButtonCallback(Button *button, ButtonCallback callback) {
    button->callback = callback;
}

// 模拟按钮点击
void clickButton(Button *button) {
    if (button->callback) {
        printf("Button '%s' clicked. Executing callback...\n", button->callback);
        button->callback();
    } else {
        printf("Button '%s' has no registered callback.\n", button->label);
    }
}

// 示例回调函数1
void onButtonClick1() {
    printf("Button 1 clicked. Performing action 1.\n");
}

// 示例回调函数2
void onButtonClick2() {
    printf("Button 2 clicked. Performing action 2.\n");
}

int main() {
    Button button1 = {"Button 1", NULL};
    Button button2 = {"Button 2", NULL};

    registerButtonCallback(&button1, onButtonClick1);
    registerButtonCallback(&button2, onButtonClick2);

    clickButton(&button1);
    clickButton(&button2);

    return 0;
}
  1. 定义回调函数类型:使用typedef定义了一个函数指针类型ButtonCallback,它指向一个无参数无返回值的函数。
  2. 定义按钮结构体Button结构体包含按钮的标签label和对应的回调函数指针callback
  3. 注册回调函数registerButtonCallback函数用于将一个具体的回调函数注册到按钮的callback成员中。
  4. 模拟按钮点击clickButton函数检查按钮是否注册了回调函数,如果注册了则执行该回调函数。
  5. 示例回调函数:定义了onButtonClick1onButtonClick2两个示例回调函数,分别在按钮点击时执行不同的操作。
  6. 主函数:创建了两个按钮实例,并为它们注册了不同的回调函数,然后模拟按钮点击操作。