我已经在函数指针上读了几个不同的SO答案作为回调,但我自己仍然遇到一些麻烦。
这样的问题:How do function pointers in C work?
并且:Understanding typedefs for function pointers in C
和其他一些人。
我不确定这是不是最好的方法。
file.h
typedef int (*reg_callback)(void*, void*); //generalize a bit?
int register_created(reg_callback cb);
int register_fixed_update(reg_callback cb);
int register_variable_update(reg_callback cb);
int register_render(reg_callback cb);
int register_pased(reg_callback cb);
int register_resume(reg_callback cb);
int register_resize(reg_callback cb);
int register_quit(reg_callback cb);
int init_engine(int width, int height, char *title, double fps);
//prototypes of functions that I need callbacks for atm maybe more soon
void created(void);
void fixed_update(void);
void variable_update(void);
void render(double alpha);
void paused(void);
void resumed(void);
void resized(int width, int height);
void quit(void);
file.c
static int register_callback_function(int c_type, reg_callback cb)
{
int success = -1;
switch(c_type)
{
case 000000:
printf("registering fixed update\n");
break;
case 000001:
printf("registering variable update\n");
break;
case 000002:
printf("registering render\n");
break;
case 000003:
printf("registering pause\n");
break;
case 000004:
printf("registering resume\n");
break;
case 000005:
printf("registering resize\n");
break;
case 000006:
printf("registering quit\n");
break;
default:break;
}
return success;
}
int register_fixed_update(reg_callback cb) { return register_callback_function(000000, cb); };
int register_variable_update(reg_callback cb) { return register_callback_function(000001, cb); };
int register_render(reg_callback cb) { return register_callback_function(000002, cb); };
int register_pased(reg_callback cb) { return register_callback_function(000003, cb); };
int register_resume(reg_callback cb) { return register_callback_function(000004, cb); };
int register_resize(reg_callback cb) { return register_callback_function(000005, cb); };
int register_quit(reg_callback cb) { return register_callback_function(000006, cb); };
int register_created(reg_callback cb) { return register_callback_function(000007, cb); };
void created(void) { //call create callback func }
void fixed_update(void) { //call fixed update callback func}
void variable_update(void) { //...}
void render(double alpha) { //...}
void paused(void) { //...}
void resumed(void) { //...}
void resized(int width, int height) { //...}
void quit(void) { //...}
目前我收到的警告如下:
warning: incompatible pointer types passing 'void (void)' to parameter of
type 'reg_callback' (aka 'int (*)(void *, void *)') [-Wincompatible-pointer-types]
register_created(created);
^~~~~~~
note: passing argument to parameter 'cb' here
int register_created(reg_callback cb);
不兼容的指针类型,但我虽然void *指针可以指向任何东西,甚至没有?
我想概括函数指针,以便我可以使用一个指针原型来处理所有这些设置代码。从不工作的代码我知道我会以错误的方式解决它并想解决这个问题。
可能有一个带有指向函数的指针的结构,但我不确定atm。
答案 0 :(得分:1)
在最初的评论和更多的研究之后,我发现了一个运行良好的系统。以下是它的结构。
函数指针结构
server.c
typedef struct
{
void (*init_fnc_ptr)(void);
void (*fixed_update_fnc_ptr)(void);
void (*variable_update_fnc_ptr)(void);
void (*render_fnc_ptr)(double alpha);
void (*paused_fnc_ptr)(void);
void (*resumed_fnc_ptr)(void);
void (*resized_fnc_ptr)(int width, int height);
void (*quit_fnc_ptr)(void);
} lfcyc_fnc_ptr;
lfcyc_fnc_ptr* lfc_f;
init() { lfc_f->init_fnc_ptr(); }
void fixed_update(void) { lfc_f->fixed_update_fnc_ptr(); }
//etc
和一个带有这些函数指针结构的函数。 在客户端代码中,我导入适当的头,然后初始化它;
lfcyc_fnc_ptr* funcs = (lfcyc_fnc_ptr *)malloc(sizeof(lfcyc_fnc_ptr));
funcs->init_fnc_ptr = &initialized;
funcs->fixed_update_fnc_ptr = &fixed_update;
funcs->variable_update_fnc_ptr = &variable_update;
funcs->render_fnc_ptr = &render;
funcs->paused_fnc_ptr = &paused;
funcs->resumed_fnc_ptr = &resumed;
funcs->resized_fnc_ptr = &resized;
funcs->quit_fnc_ptr = &quit;
register functions(funcs);
//work
free(funcs);
然后将正确的地址传递给服务器函数,然后它可以在客户端代码中调用它所需的函数。
我希望如果他们将来遇到这样的事情,就可以帮助别人。