2011-12-19 42 views
16

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

それは次のようになります。

void (*current_menu)(int); 

我々はmenus.c、menus.hメインに何を書くのですか?

答えて

0

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

18

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

いくつかのソースファイルから変数を表示したい場合、最も簡単な解決策はヘッダ内にexternと宣言し、定義は別の場所にします。

ヘッダーで:1つのソースファイルで

extern void (*current_menu)(int); 

void (*current_menu)(int) = &the_func_i_want; 
+0

ty、今すぐ動作します – user1106072

+2

アンパサンドが厳密に必要ではありません – Dave

+1

それは本当です、@デイブ。 Cでは、わかりやすいように私のスタイルを選択しています。 C++では、特定のテンプレートのコンテキストで必要となることもあるので、一貫性を保つために行うだけです。 –

6

それは多くの場合、関数ポインタで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で呼び出します。

+0

非常に真実です! 'function 'は、ブーストまたはC++へのアクセス権がある場合にも利用できます。 –

関連する問題