C中函数指针的recursion声明

我想声明一个函数,返回一个指向相同types的函数的指针。

我想用它来实现像下面这样的状态机:

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); //... 

我设法解决使用结构的compliation错误,如下所示:

 typedef struct event_handler { struct event_handler (*func)(event_t *); } event_handler_t; 

但是这使得返回声明更加复杂:

 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; } 

我想知道是否有更好的方法来创buildc中的这样的函数指针。

在C中不可能做到这一点:函数不能返回指向自身的指针,因为types声明recursion地扩展,永远不会结束。 看到这个页面的解释: http : //www.gotw.ca/gotw/057.htm

在上面描述的解决方法意味着返回void (*) ()而不是正确types的函数指针; 你的解决方法可以说是一个整洁。

这在Herb Sutter的“ More Exceptional C ++ ”第32条中讨论过,答案似乎是(对于C)“不是没有使用types转换”。 对于C ++来说,通常可以引入一个类来提供一些额外的间接性。