ヘッダーファイルで関数ポインタを宣言する方法について少し混乱しています。 mainとmenus.cというファイルで使用し、menus.hで宣言したいと思います。特定の関数を指すように初期化します。
次のようになります。
void (*current_menu)(int);
Menus.c、menus.h、mainに何を書きますか?
関数ポインターは依然としてポインターであり、変数であることを意味します。
変数を複数のソースファイルから表示したい場合、最も簡単な解決策は、ヘッダーでextern
と宣言し、他の場所で定義することです。
ヘッダー内:
extern void (*current_menu)(int);
1つのソースファイル内:
void (*current_menu)(int) = &the_func_i_want;
関数ポインタで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
が現在指している関数を呼び出す。
ポインタ関数自体には関数定義がありません。これは、型へのポインタにすぎません。型は、関数の戻り値の型とパラメータリストによって指定されます。同じパラメータリストと戻り値の型を使用して関数を定義し、ポインタ関数を使用してその関数のアドレスを保持する必要があります。その後、ポインタを介して関数を呼び出すことができます。