如何在头文件和c文件中声明函数指针?

use*_*072 18 c pointers header function prototype-programming

我对如何在头文件中声明函数指针感到困惑.我想在main和一个名为menus.c的文件中使用它,并在menus.h中声明它.我假设.我们想要初始化以指向某个功能.

它看起来像这样:

void (*current_menu)(int);
Run Code Online (Sandbox Code Playgroud)

我们在menus.c,menus.h和main中写了什么?

Dre*_*ann 21

函数指针仍然是指针,这意味着它仍然是一个变量.

如果您希望从多个源文件中看到变量,最简单的解决方案是extern在标题中声明它,并在其他位置定义.

在标题中:

extern void (*current_menu)(int);
Run Code Online (Sandbox Code Playgroud)

在一个源文件中:

void (*current_menu)(int) = &the_func_i_want;
Run Code Online (Sandbox Code Playgroud)

  • &符号并非绝对必要 (2认同)

unw*_*ind 8

使用typedef函数指针通常很有帮助,因此您可以将类型命名为描述性的类型:

typedef void (*MenuFunction)(int);
Run Code Online (Sandbox Code Playgroud)

那么你可能有一个这种类型的全局变量,可能在menus.c中,并在menus.h中声明(with extern):

static void my_first_menu_function(int x)
{
  printf("the menu function got %d\n", x);
}

MenuFunction current_menu = my_first_menu_function;
Run Code Online (Sandbox Code Playgroud)

从main.c,您可以执行以下操作:

#include "menu.h"

current_menu(4711);
Run Code Online (Sandbox Code Playgroud)

调用当前指向的任何函数current_menu.


MGZ*_*ero 0

指针函数本身没有函数定义。它只不过是一个指向类型的指针,该类型由函数的返回类型和参数列表指定。您需要做的是定义一个具有相同参数列表和返回类型的函数,然后使用指针函数来保存该函数的地址。然后您可以通过指针调用该函数。