2011-12-19 5 views
16

Sono un po 'confuso su come dichiarare un puntatore a funzione in un file di intestazione. Voglio usarlo in main e in un file chiamato menu.c e dichiararlo nei menu.h presumo. Vogliamo inizializzarsi per puntare a una determinata funzione.Come dichiarare il puntatore di funzione nell'intestazione e nel c-file?

sembra che questo:

void (*current_menu)(int); 

cosa che scriviamo in menus.c, menus.h e principale?

risposta

0

Una funzione puntatore non ha una definizione di funzione. Non è altro che un puntatore a un tipo, il tipo specificato dal tipo di ritorno della funzione e l'elenco dei parametri. Quello che devi fare è definire una funzione con lo stesso elenco di parametri e tipo di ritorno, quindi utilizzare la funzione puntatore per mantenere l'indirizzo di quella funzione. È quindi possibile chiamare la funzione tramite il puntatore.

18

Un puntatore a funzione è ancora un puntatore, il che significa che è ancora una variabile.

Se si desidera che una variabile sia visibile da diversi file di origine, la soluzione più semplice è dichiararla extern in un'intestazione, con la definizione altrove.

In un colpo di testa:

extern void (*current_menu)(int); 

In un file sorgente:

void (*current_menu)(int) = &the_func_i_want; 
+0

ty, ora funziona – user1106072

+2

la e commerciale non è strettamente necessaria – Dave

+1

Questo è vero, @Dave. In C, è una mia scelta stilistica per chiarezza. In C++ a volte è richiesto in determinati contesti di template, quindi lo faccio per coerenza. –

6

È spesso utile usare typedef con puntatori a funzione, in modo da poter assegnare un nome al tipo di qualcosa di descrittivo :

typedef void (*MenuFunction)(int); 

allora si avrebbe una variabile globale di questo tipo, probabilmente nel menus.c, e ha dichiarato (con extern) in menus.h:

static void my_first_menu_function(int x) 
{ 
    printf("the menu function got %d\n", x); 
} 

MenuFunction current_menu = my_first_menu_function; 

Da main.c, è quindi possibile fare:

#include "menu.h" 

current_menu(4711); 

per chiamare qualsiasi funzione attualmente indicata da current_menu.

+0

Molto vero! 'function ' è disponibile anche se si ha accesso a boost o C++ 11. –

Problemi correlati