web-dev-qa-db-ja.com

ヘッダーとCファイルで関数ポインタを宣言する方法は?

ヘッダーファイルで関数ポインタを宣言する方法について少し混乱しています。 mainとmenus.cというファイルで使用し、menus.hで宣言したいと思います。特定の関数を指すように初期化します。

次のようになります。

void (*current_menu)(int);

Menus.c、menus.h、mainに何を書きますか?

18
user1106072

関数ポインターは依然としてポインターであり、変数であることを意味します。

変数を複数のソースファイルから表示したい場合、最も簡単な解決策は、ヘッダーでexternと宣言し、他の場所で定義することです。

ヘッダー内:

extern void (*current_menu)(int);

1つのソースファイル内:

void (*current_menu)(int) = &the_func_i_want;
21
Drew Dormann

関数ポインタでtypedefを使用すると便利なことがよくあるので、タイプにわかりやすい名前を付けることができます。

typedef void (*MenuFunction)(int);

次に、おそらくmenus.cにこのタイプのグローバル変数があり、menus.hで(externを使用して)宣言されます。

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が現在指している関数を呼び出す。

8
unwind

ポインタ関数自体には関数定義がありません。これは、型へのポインタにすぎません。型は、関数の戻り値の型とパラメータリストによって指定されます。同じパラメータリストと戻り値の型を使用して関数を定義し、ポインタ関数を使用してその関数のアドレスを保持する必要があります。その後、ポインタを介して関数を呼び出すことができます。

0
MGZero