如何在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
相关产品推荐
相关产品推荐

