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.