19

I'm a little confused over how to declare a function pointer in a header file. I want to use it in main and a file called menus.c and declare it in menus.h I assume. We want to initialize to point to a certain function.

it looks like this:

void (*current_menu)(int);

What do we write in menus.c, menus.h and main?

Rob W
  • 341,306
  • 83
  • 791
  • 678
user1106072
  • 331
  • 2
  • 4
  • 8

3 Answers3

25

A function pointer is still a pointer, meaning it's still a variable.

If you want a variable to be visible from several source files, the simplest solution is to declare it extern in a header, with the definition elsewhere.

In a header:

extern void (*current_menu)(int);

In one source file:

void (*current_menu)(int) = &the_func_i_want;
Drew Dormann
  • 59,987
  • 13
  • 123
  • 180
  • 2
    the ampersand isn't strictly necessary – Dave Dec 19 '11 at 16:27
  • 1
    That is true, @Dave. In C, it's a stylistic choice of mine for clarity. In C++ it's sometimes required in certain template contexts, so I just do it for consistency. – Drew Dormann Dec 19 '11 at 17:06
  • @DrewDormann I thought `extern` was redundant. Shouldn't it be globally visible without specifying `extern`? – Geremia Jun 11 '15 at 21:05
  • 1
    @Geremia [How do I use extern to share variables between source files in C?](http://stackoverflow.com/questions/1433204) – Drew Dormann Jun 11 '15 at 21:22
8

It's often helpful to use typedef with function pointers, so you can name the type to something descriptive:

typedef void (*MenuFunction)(int);

Then you would have a global variable of this type, probably in menus.c, and declared (with 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;

From main.c, you can then do:

#include "menu.h"

current_menu(4711);

to call whatever function is currently pointed at by current_menu.

unwind
  • 391,730
  • 64
  • 469
  • 606
0

A pointer function itself does not have a function definition. It's nothing more than a pointer to a type, the type being specified by the return type of the function and the parameter list. What you need to do is define a function with the same parameter list and return type, then use your pointer function to hold that function's address. You can then call the function through the pointer.

MGZero
  • 5,812
  • 5
  • 29
  • 46