2010-04-29 18 views
5

Sono un novizio di C. Sto cercando di implementare la funzione di callback utilizzando i puntatori di funzione.Implementazione delle funzioni di callback in C

sto ottenendo un errore

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

quando provo a compilare il seguente programma:

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

Che cosa è questo errore Chiunque può aiutare?

+0

'register' è una parola chiave, BTW. –

+0

In quale riga viene visualizzato l'errore? –

+0

Solo un suggerimento: typedef aiuta a rendere le cose un po 'più leggibili: 'typedef void (* CallbackFunc) (void);'. Quindi la firma della funzione è 'void registerFunc (CallbackFunc callback)' e le tue dichiarazioni sono 'CallbackFunc my_cb = & callback_proc' – detly

risposta

3

mi sento di raccomandare di utilizzare 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: rimosso il problema registro

+1

dov'è il typedef? questa è un'ottima raccomandazione, ma manca il tuo esempio. –

+0

Non riesco a vedere il typedef? Quello che hai fatto è definito un puntatore a funzione, che non è sicuro da testo. –

+0

Scusa non ho capito che ho avuto un problema con copia e incolla – stacker

2

Non è possibile utilizzare 'registrare' come nome della funzione in quanto è una parola chiave C.

19
  1. register è una parola chiave C: utilizzare un altro nome per la funzione.

  2. Sono presenti parate aggiuntive attorno al parametro di callback. Dovrebbe essere:

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

Sì, l'extra parens era difficile da catturare. +1 –

0

2 problemi:

  • non è possibile utilizzare il nome register come è una parola chiave (non utilizzato più spesso, ma è ancora lì)
  • modificare la definizione della funzione da

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

    a:

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

    (eliminare i paren attorno alla dichiarazione del parametro.

Inoltre si potrebbe ottenere un avvertimento circa callback_proc() non avere un delaration corrispondente alla variabile callback (a seconda di come si compila il programma - come C o C++), così si potrebbe desiderare di cambiare la sua dichiarazione:

void callback_proc (void) 

per rendere esplicito che non richiede parametri.

0

Dai un'occhiata allo type safe callbacks dal ccan. La sua unica cosa è quella di esporre un puntatore a funzione tipizzata per il mondo da usare, l'altro per garantire un cast sicuro.

+1

Ciao Tim, il link nella tua risposta è morto. – bummi

+0

@bummi, se Tim decide di cancellare questa risposta, riceverà un messaggio * Questo post è stato cancellato da Tim Post ♦. Per sapere perché la tua risposta è stata cancellata, per favore 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; 
} 

Dichiarare the_callback statica avrebbe più senso se questo codice è stato modulare e quindi si sarebbe costretti a chiamare callback_register al fine di impostare e callback al fine di chiamare - the_callback non sarebbe al di fuori accessibile del implementazione (.c) solo le dichiarazioni di funzione sarebbero nell'intestazione (.h).

+0

grazie mille ... potrei capire i miei errori – user329013

Problemi correlati