C中函数指针的递归声明

时间:2009-04-27 13:17:16

标签: c c89

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

我想用它来实现如下所示的状态机:

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

我想知道是否有更好的方法在c。

中创建这样的函数指针

2 个答案:

答案 0 :(得分:8)

在C中不可能这样做:函数不能返回指向自身的指针,因为类型声明以递归方式扩展而永不结束。请参阅此页面以获取解释:http://www.gotw.ca/gotw/057.htm

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

答案 1 :(得分:2)

这在Herb Sutter的书 More Exceptional C ++ ,Item 32中进行了讨论,答案似乎是(对于C)“并非没有使用强制转换”。对于C ++,可以通常引入一个类来提供一些额外的间接。