私は、ヘッダーファイルに関数ポインタを宣言する方法について少し混乱しています。 私はmainとmenus.cでファイルを使い、menus.hで宣言したいと思います。 特定の関数を指すように初期化します。ヘッダとcファイルに関数ポインタを宣言するには?
それは次のようになります。
void (*current_menu)(int);
我々はmenus.c、menus.hメインに何を書くのですか?
私は、ヘッダーファイルに関数ポインタを宣言する方法について少し混乱しています。 私はmainとmenus.cでファイルを使い、menus.hで宣言したいと思います。 特定の関数を指すように初期化します。ヘッダとcファイルに関数ポインタを宣言するには?
それは次のようになります。
void (*current_menu)(int);
我々はmenus.c、menus.hメインに何を書くのですか?
ポインタ関数自体には関数定義がありません。これは型のポインタであり、型は関数の戻り値の型とパラメータリストによって指定されます。あなたがしなければならないことは、同じパラメータリストと戻り値の型を持つ関数を定義し、ポインタ関数を使ってその関数のアドレスを保持することです。ポインタを使用して関数を呼び出すことができます。
関数ポインタは依然として変数であることを意味するポインタです。
いくつかのソースファイルから変数を表示したい場合、最も簡単な解決策はヘッダ内にextern
と宣言し、定義は別の場所にします。
ヘッダーで:1つのソースファイルで
extern void (*current_menu)(int);
:
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
で呼び出します。
非常に真実です! 'function
ty、今すぐ動作します – user1106072
アンパサンドが厳密に必要ではありません – Dave
それは本当です、@デイブ。 Cでは、わかりやすいように私のスタイルを選択しています。 C++では、特定のテンプレートのコンテキストで必要となることもあるので、一貫性を保つために行うだけです。 –