2011-12-19 16 views
16

Jestem trochę zdezorientowany, jak zadeklarować wskaźnik funkcji w pliku nagłówkowym. Chcę użyć go w głównym pliku o nazwie menus.c i zadeklarować go w menu. H. Zakładam. Chcemy zainicjować, aby wskazać określoną funkcję.Jak zadeklarować wskaźnik funkcji w nagłówku i pliku c?

wygląda to tak:

void (*current_menu)(int); 

Co piszemy w menus.c, menus.h i główne?

Odpowiedz

0

Funkcja wskaźnika nie ma definicji funkcji. To nic innego jak wskaźnik do typu, typ określony przez typ zwracany przez funkcję i listę parametrów. Trzeba tylko zdefiniować funkcję z tą samą listą parametrów i typem powrotu, a następnie użyć funkcji wskaźnika do przechowywania adresu tej funkcji. Następnie możesz wywołać funkcję za pomocą wskaźnika.

18

Wskaźnik funkcji jest nadal wskaźnikiem, co oznacza, że ​​wciąż jest zmienną.

Jeśli chcesz, aby zmienna była widoczna z kilku plików źródłowych, najprostszym rozwiązaniem jest zadeklarowanie jej w nagłówku jako extern, z definicją gdzie indziej.

w nagłówku:

extern void (*current_menu)(int); 

W jednym pliku źródłowym:

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

ty, teraz działa – user1106072

+2

ampersand nie jest bezwzględnie potrzebny – Dave

+1

To prawda, @Dave. W C jest to mój stylistyczny wybór dla jasności. W C++ czasami jest to wymagane w pewnych kontekstach szablonów, więc robię to dla spójności. –

6

To często pomocne w użyciu typedef ze wskaźników funkcji, można więc nazwać rodzaj do czegoś opisowej :

typedef void (*MenuFunction)(int); 

Wtedy masz zmienną globalną tego typu, prawdopodobnie w menus.c, a zadeklarowana (z extern) w 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; 

Od main.c, można wtedy zrobić:

#include "menu.h" 

current_menu(4711); 

wywoływanie dowolnej funkcji wskazanej w danym momencie przez current_menu.

+0

Bardzo prawdziwe! 'funkcja ' jest również dostępna, jeśli masz dostęp do boost lub C++ 11. –

Powiązane problemy