我想声明一个返回指向同一类型函数的指针的函数.
我想用它来实现如下所示的状态机:
typedef event_handler_t (*event_handler_t)(event_t*); // compilation error
event_handler_t state2(event_t* e);
event_handler_t state1(event_t* e) {
switch(e->type) {
//...
case SOME_EVENT:
return state2;
//...
}
}
event_handler_t state2(event_t* e) {
switch(e->type) {
//...
case OTHER_EVENT:
return state1;
//...
}
}
//...
event_handler_t event_handler;
//...
event_handler(&e);
//...
Run Code Online (Sandbox Code Playgroud)
我设法使用如下结构解决compliation错误:
typedef struct event_handler {
struct event_handler (*func)(event_t *);
} event_handler_t;
Run Code Online (Sandbox Code Playgroud)
但这会使返回声明更加复杂:
event_handler_t state2(event_t* e) {
{
event_handler_t next_handler = {NULL};
switch(e->type) {
//...
case OTHER_EVENT:
next_handler.func = state1;
break;
//...
}
return next_handler;
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更好的方法在c中创建这样的函数指针.
在C中不可能这样做:函数不能返回指向自身的指针,因为类型声明以递归方式扩展而永不结束.请参阅此页面以获取解释:http://www.gotw.ca/gotw/057.htm
上面描述的解决方法意味着返回void (*) ()
而不是正确类型的函数指针; 你的解决方法可以说有点整洁.