C语言中函数指针的递归声明

22

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

我想使用它来实现像下面这个状态机一样的东西:

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

我设法通过以下结构来解决编译错误:

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

我想知道是否有更好的方法在C语言中创建这样的函数指针。


1
参见:SO 816356 - Jonathan Leffler
2个回答

8
在C语言中无法完成此操作:函数无法返回指向自身的指针,因为类型声明会递归扩展且永远不会结束。请参阅此页面以获取说明:http://www.gotw.ca/gotw/057.htm 上述页面描述的解决方法意味着返回void(*)()而不是正确类型的函数指针;你提供的解决方案可能更加简洁明了。

2
这个问题在Herb Sutter的书《More Exceptional C++》中讨论过,第32项,答案似乎是(对于C语言)“不能没有使用强制转换”。对于C ++,可以通过引入类来提供一些额外的间接性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接