Как объявить указатель на функцию в заголовке и c-файле? - PullRequest
17 голосов
/ 19 декабря 2011

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

это выглядит так:

void (*current_menu)(int);

Что мы пишем в menus.c, menus.h и main?

Ответы [ 3 ]

20 голосов
/ 19 декабря 2011

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

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

В заголовке:

extern void (*current_menu)(int);

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

void (*current_menu)(int) = &the_func_i_want;
8 голосов
/ 19 декабря 2011

Часто полезно использовать 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 голосов
/ 19 декабря 2011

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

...