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;

但这使得 return 语句更加复杂:

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 中创建这样的函数指针。

4

2 回答 2

8

在 C 中不可能做到这一点:函数不能返回指向自身的指针,因为类型声明递归地扩展并且永远不会结束。有关说明,请参阅此页面:http ://www.gotw.ca/gotw/057.htm

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

于 2009-04-27T13:24:23.207 回答
2

Herb Sutter 的《More Exceptional C++》第 32 条对此进行了讨论,其中的答案似乎是(对于 C)“并非不使用强制转换”。对于 C++,通常引入一个类来提供一些额外的间接性是可能的。

于 2009-04-27T13:25:34.780 回答