Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Recursive declaration of function pointer in C

Tags:

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.

like image 315
Piotr Czapla Avatar asked Apr 27 '09 13:04

Piotr Czapla


1 Answers

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.

like image 175
Tim Robinson Avatar answered Oct 05 '22 04:10

Tim Robinson