2011-12-19 14 views

Respuesta

0

Una función de puntero en sí no tiene una definición de función. No es más que un puntero a un tipo, el tipo que se especifica por el tipo de retorno de la función y la lista de parámetros. Lo que necesita hacer es definir una función con la misma lista de parámetros y el tipo de retorno, luego use su función de puntero para mantener la dirección de esa función. A continuación, puede llamar a la función a través del puntero.

18

Un puntero a la función sigue siendo un puntero, lo que significa que todavía es una variable.

Si desea que una variable sea visible desde varios archivos de origen, la solución más simple es declararlo extern en un encabezado, con la definición en otro lugar.

En un encabezado:

extern void (*current_menu)(int); 

En un archivo de origen:

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

ty, ahora funciona – user1106072

+2

el ampersand no es estrictamente necesario – Dave

+1

Eso es cierto, @Dave. En C, es una elección estilística para la claridad. En C++ a veces se requiere en ciertos contextos de plantilla, así que lo hago por coherencia. –

6

A menudo es útil usar typedef con punteros de función, por lo que puede nombrar el tipo de algo descriptivo :

typedef void (*MenuFunction)(int); 

entonces habría una variable global de este tipo, probablemente en menus.c, y declaró (con extern) en 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; 

De main.c, a continuación, puede hacer:

#include "menu.h" 

current_menu(4711); 

para llamar a cualquier función apuntada actualmente por current_menu.

+0

¡Muy cierto! 'función ' también está disponible si tiene acceso a boost o C++ 11. –

Cuestiones relacionadas