una todas tipos punteros parametros llamar lenguaje las funciones funcion ejemplos con como c c89

todas - Declaración recursiva de puntero de función en C



tipos de funciones en lenguaje c (2)

Esto se discute en el libro More Exceptional C ++ , artículo 32 de Herb Sutter, donde la respuesta parece ser (para C) "no sin uso de moldes". Para C ++ es posible, con la introducción habitual de una clase, proporcionar alguna dirección adicional.

Me gustaría declarar una función que devuelve un puntero a una función del mismo tipo.

Me gustaría usarlo para implementar máquinas de estado como la siguiente:

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

Logro solucionar el error de cumplimiento utilizando las estructuras siguientes:

typedef struct event_handler { struct event_handler (*func)(event_t *); } event_handler_t;

Pero esto hace que la declaración de retorno sea más complicada:

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

Me pregunto si hay una mejor manera de crear tales punteros de función en c.


No es posible hacer esto en C: una función no puede devolver un puntero a sí misma, ya que la declaración de tipo se expande recursivamente y nunca termina. Vea esta página para una explicación: http://www.gotw.ca/gotw/057.htm

La solución descrita en la página anterior significa devolver void (*) () lugar del puntero de función correctamente escrito; Su solución es posiblemente un poco más limpia.