2010-04-29 8 views
5

Je suis un novice de C. J'essaie d'implémenter la fonction de rappel en utilisant des pointeurs de fonction.Implémentation des fonctions de rappel dans C

Je reçois une erreur

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

lorsque je tente de compiler le programme suivant:

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

Quelle est cette erreur Quelqu'un peut-il aider?

+0

'register' est un mot-clé, BTW. –

+0

Sur quelle ligne obtenez-vous l'erreur? –

+0

Juste un conseil: typedefs aide à rendre les choses un peu plus lisibles: 'typedef void (* CallbackFunc) (void);'. Ensuite, la signature de votre fonction est 'void registerFunc (CallbackFunc callback)' et vos déclarations sont 'CallbackFunc my_cb = & callback_proc' – detly

Répondre

3

Je recommande d'utiliser 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: suppression de la question du registre

+1

où est le typedef? C'est une très bonne recommandation, mais votre exemple le manque. –

+0

Je n'arrive pas à voir le typedef? Ce que vous avez fait est défini par un pointeur de fonction, qui n'est pas de type sécurisé. –

+0

Désolé je ne savais pas que j'avais un problème avec copier et coller – stacker

2

Vous ne pouvez pas utiliser « registre » comme nom de la fonction comme il est un mot-clé C.

19
  1. register est un mot-clé C: utiliser un autre nom pour la fonction.

  2. Vous avez des parenthèses supplémentaires autour du paramètre de rappel. Il devrait être:

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

Oui, les parens supplémentaires était difficile à attraper. +1 –

0

2 problèmes:

  • vous ne pouvez pas utiliser le nom register comme il est un mot-clé (non utilisé souvent plus, mais il est toujours là)
  • changer la définition de la fonction de

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

    à: 012 (Débarrassez-vous des parens autour de la déclaration du paramètre.).

Aussi, vous pourriez obtenir un avertissement sur callback_proc() ne pas avoir un delaration correspondant à la variable callback (selon la façon dont vous compilez le programme - comme C ou C++), vous voudrez peut-être changer sa déclaration:

void callback_proc (void) 

pour rendre explicite qu'il ne prend aucun paramètre.

0

Jetez un oeil à type safe callbacks de ccan. C'est une chose d'exposer un pointeur de fonction typé pour le monde à utiliser, son autre pour assurer un casting sain.

+1

Bonjour Tim, le lien dans votre réponse est mort. – bummi

+0

@bummi, si Tim décide de supprimer cette réponse, il recevra un message * Ce message a été supprimé par Tim Post ♦. Pour savoir pourquoi votre réponse a été supprimée s'il vous plaît utiliser 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; 
} 

Déclarant the_callback statique serait plus logique si ce code était modularisé et vous serez alors obligé d'appeler callback_register afin de le mettre, et callback afin de l'appeler - ne serait pas accessible the_callback en dehors de la implémentation (.c) Seules les déclarations de fonctions seraient dans l'en-tête (.h).

+0

merci beaucoup ... je pouvais comprendre mes erreurs – user329013