2011-12-19 6 views
16

Я немного смущен тем, как объявить указатель функции в файле заголовка. Я хочу использовать его в main и файл под названием menus.c и объявить его в menus.h Я предполагаю. Мы хотим инициализировать, чтобы указать на определенную функцию.Как объявить указатель функции в заголовке и c-файле?

это выглядит следующим образом:

void (*current_menu)(int); 

Что мы пишем в menus.c, menus.h и главный?

ответ

0

Функция указателя не имеет определения функции. Это не более чем указатель на тип, тип которого задается возвращаемым типом функции и списком параметров. Что вам нужно сделать, так это определить функцию с тем же списком параметров и возвращаемым типом, а затем использовать функцию указателя для хранения адреса этой функции. Затем вы можете вызвать функцию через указатель.

18

Указатель функции по-прежнему является указателем, что означает, что это все еще переменная.

Если вы хотите, чтобы переменная была видимой из нескольких исходных файлов, самым простым решением является объявить ее extern в заголовке с определением в другом месте.

В заголовке:

extern void (*current_menu)(int); 

В одном исходном файле:

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

ty, теперь он работает – user1106072

+2

амперсанд строго необходим – Dave

+1

Это правда, @Dave. В C это стилистический выбор для ясности. В C++ это иногда требуется в определенных контекстах шаблонов, поэтому я просто делаю это для согласованности. –

6

Это часто бывает полезно использовать typedef с указателями на функции, так что вы можете назвать тип к чему-то описательного :

typedef void (*MenuFunction)(int); 

Тогда вы бы глобальную переменную этого типа, вероятно, в menus.c, и заявил (с extern) в 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; 

С main.c, вы можете сделать:

#include "menu.h" 

current_menu(4711); 

для вызова любой функции, на которую в данный момент указана current_menu.

+0

Очень верно! 'function ' также доступна, если у вас есть доступ к boost или C++ 11. –