I'd like to declare a function that returns a pointer to a function of the same type.
I would like to use it to implement state machines like the one below:
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); //...
I manage to work around the compliation error using structures as follows:
typedef struct event_handler { struct event_handler (*func)(event_t *); } event_handler_t;
But this makes return statment more complicated:
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; }
I wonder if there is a better way to create such function pointers in c.
It's not possible to do this in C: a function can't return a pointer to itself, since the type declaration expands recursively and never ends. See this page for an explanation: http://www.gotw.ca/gotw/057.htm
The workaround described on the above page means returning void (*) ()
instead of the correctly-typed function pointer; your workaround is arguably a little neater.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With