2010-04-29 26 views
5

Soy un novato en C. Estoy tratando de implementar la función de devolución de llamada utilizando punteros a funciones.Implementación de funciones de devolución de llamada en C

estoy recibiendo un error

:test_callback.c:10: error: expected identifier or ‘(’ before ‘void’ 

cuando intento compilar el programa siguiente:

#include<stdio.h> 

void (*callback) (void); 

void callback_proc() 
{ 
    printf ("Inside callback function\n"); 
} 

void register ((void (*callback) (void))) 
{ 
    printf ("Inside registration \n"); 
    callback(); /* Calling an initial callback with function pointer */ 
} 

int main() 
{ 
    callback = callback_proc;/* Assigning function to the function pointer */ 
    register (callback);/* Passing the function pointer */ 
    return 0; 
} 

¿Qué es este error ¿Alguien puede ayudar?

+0

'register' es una palabra clave, por cierto. –

+0

¿En qué línea aparece el error? –

+0

Solo un consejo: typedefs ayuda a que las cosas sean un poco más legibles: 'typedef void (* CallbackFunc) (void);'. Entonces la firma de su función es 'void registerFunc (CallbackFunc callback)' y sus declaraciones son 'CallbackFunc my_cb = & callback_proc' – detly

Respuesta

3

recomendaría utilizar un typedef

#include<stdio.h> 

typedef void (*callback_t) (void); 
callback_t callback; 

void callback_proc(void) 
{ 
    printf ("Inside callback function\n"); 
} 

void reg(callback_t _callback) 
{ 
    printf ("Inside registration \n"); 
    _callback(); 
} 

int main() 
{ 
    callback = callback_proc; 
    reg(callback); 

    return 0; 
} 

EDIT: eliminado el problema de registro

+1

¿dónde está el typedef? esa es una muy buena recomendación, pero su ejemplo no se encuentra. –

+0

¿No puedo ver el typedef? Lo que ha hecho es definir un puntero a la función, que no es seguro. –

+0

Lo siento, no me di cuenta de que tenía un problema con copiar y pegar – stacker

2

No puede utilizar 'registro' como un nombre de función, ya que es una palabra clave C.

19
  1. register es una palabra clave C: utilizar otro nombre para la función.

  2. Tiene parantheses adicionales alrededor del parámetro de devolución de llamada. Debe ser:

    void funcName(void (*callback) (void)) 
    
+0

Sí, el par adicional era difícil de atrapar. +1 –

0

2 problemas:

  • no se puede utilizar el nombre register ya que es una palabra clave (no se utiliza a menudo más, pero aún así existe)
  • cambie la definición de la función de

    void wasRegister((void (*callback) (void))) 
    

    a:

    void wasRegister(void (*callback) (void)) 
    

    (deshaga los paréntesis de la declaración del parámetro.

También es posible obtener una advertencia sobre callback_proc() no tener un delaration correspondiente a la variable callback (dependiendo de cómo se compila el programa - como C o C++), por lo que es posible que desee cambiar su declaración a:

void callback_proc (void) 

para indicar explícitamente que no requiere parámetros.

0

Echa un vistazo a type safe callbacks de ccan. Una cosa es exponer un puntero de función tipeada para que el mundo lo use, y otra es garantizar un casting sensato.

+1

Hola Tim, el enlace en tu respuesta está muerto. – bummi

+0

@bummi, si Tim alguna vez decide eliminar esta respuesta, recibirá un mensaje * Esta publicación fue eliminada por Tim Post ♦. Para saber por qué se eliminó tu respuesta, usa meta *: D –

0
#include<stdio.h> 

typedef void (*callback_func) (void); 

static callback_func the_callback = 0; 

void process (void) 
{ 
    printf ("Inside process function\n"); 
} 

void callback_register (callback_func cb) 
{ 
    the_callback = cb; 
    printf ("Inside registration \n"); 
} 

void callback(void) 
{ 
    the_callback(); 
} 

int main (void) 
{ 
    callback_register(process); /* Passing the function pointer */ 
    callback(); 
    return 0; 
} 

Declarar the_callback estática tendría más sentido si este código era modular y entonces se vería obligado a llamar callback_register con el fin de establecer, y callback con el fin de llamar - the_callback no sería accesible desde fuera de la implementación (.c) solo las declaraciones de función estarían en el encabezado (.h).

+0

muchas gracias ... podría entender mis errores – user329013

Cuestiones relacionadas