You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中向函数传递任意可执行命令代码?

在C语言中传递任意执行命令到函数的实现方案

你要的需求完全可以实现,核心就是用回调函数,之前没成功大概率是回调的参数设计或者调用方式不对。下面用你提到的Allegro场景给出具体实现:

1. 定义回调函数类型

因为不同绘图操作的参数不一样,我们可以用一个通用的回调类型,搭配自定义参数结构体来传递数据:

// 通用绘图回调类型,参数是用户自定义的数据指针
typedef void (*DrawCallback)(void* data);

2. 实现封装固定逻辑的draw函数

这个函数负责处理切换目标位图、清屏、刷新这些固定操作,中间调用传入的回调执行自定义绘图命令:

void draw(ALLEGRO_BITMAP* buffer, ALLEGRO_DISPLAY* disp, DrawCallback callback, void* callback_data) {
    // 切换到缓冲区绘制
    al_set_target_bitmap(buffer);
    // 执行用户传入的绘图命令
    callback(callback_data);
    // 切回显示器后台缓冲区
    al_set_target_bitmap(al_get_backbuffer(disp));
    // 清屏
    al_clear_to_color(al_map_rgb_f(0, 0, 0));
    // 绘制缓冲区内容
    al_draw_bitmap(buffer, 0, 0, 0);
    // 刷新显示
    al_flip_display();
}

3. 定义不同绘图操作的参数结构体和回调实现

针对不同的绘图需求,定义对应的参数结构体,再写具体的回调函数:

示例1:绘制文本

// 绘制文本的参数结构体
typedef struct {
    ALLEGRO_FONT* font;
    ALLEGRO_COLOR color;
    float x;
    float y;
    int flags;
    const char* text;
} DrawTextData;

// 绘制文本的回调函数
void draw_text_callback(void* data) {
    DrawTextData* text_data = (DrawTextData*)data;
    al_draw_text(text_data->font, text_data->color,
                 text_data->x, text_data->y,
                 text_data->flags, text_data->text);
}

示例2:绘制圆形

// 绘制圆形的参数结构体
typedef struct {
    ALLEGRO_COLOR color;
    float cx;
    float cy;
    float radius;
} DrawCircleData;

// 绘制圆形的回调函数
void draw_circle_callback(void* data) {
    DrawCircleData* circle_data = (DrawCircleData*)data;
    al_draw_circle(circle_data->cx, circle_data->cy,
                   circle_data->radius, circle_data->color, 2.0f);
}

4. 调用draw函数的示例

// 调用绘制文本
DrawTextData text_data = {
    .font = your_font,
    .color = al_map_rgb(255, 255, 255),
    .x = 0,
    .y = 0,
    .flags = 0,
    .text = "Hello World!"
};
draw(buffer_1, disp, draw_text_callback, &text_data);

// 调用绘制圆形
DrawCircleData circle_data = {
    .color = al_map_rgb(255, 0, 0),
    .cx = 100,
    .cy = 100,
    .radius = 50
};
draw(buffer_1, disp, draw_circle_callback, &circle_data);

关键说明

  • 这种方式的核心是把“绘图命令+参数”打包成回调和数据结构体,让draw函数可以通用处理任意绘图操作
  • 如果觉得每次定义结构体麻烦,也可以用可变参数配合宏,但回调+结构体的方式类型更安全,可读性更好

内容的提问来源于stack exchange,提问作者1toneboy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 03:24:54