2012-01-04 37 views
5

別の関数ポインタを返す関数へのポインタを宣言するにはどうすればよいですか? 構文とサンプルコードスニペットを教えてください。Cで関数ポインタを返す関数へのポインタの構文

また、関数ポインタを返す関数ポインタを使用するシナリオはありますか?

+3

最後に自分の名前を追加しないでくださいあなたの署名が自動的に投稿の最後に表示されます。 http://stackoverflow.com/faq#signatures –

+0

タイトルとテキストをわかりやすくするために、タイトルとテキストを調整しました。変更が気に入らないのであれば、もちろんそれを元に戻すことは自由ですが、問題を少し明確にするかもしれないので、違いを慎重に検討することをお勧めします。 – dmckee

答えて

9

これは、型定義と簡単です:

typedef int(*FP0)(void); 
typedef FP0(*FP1)(void); 

FP1FP0の関数ポインタを返す関数へのポインタの種類です。

これが便利な場合は、関数ポインタを返す関数があり、この関数へのポインタを取得または格納する必要がある場合に便利です。

+0

宣言は問題ありませんが、関数ポインタを使用して関数ポインタを返すコードスニペットを教えてください。それは私がはっきり理解するのに役立ちます。また、typedefを使用して構文を与えてください。 – vijayanand1231

+0

typedefは必ずしも実行可能なわけではありません。私。テンプレートエイリアスを実行するコンパイラがなく、_functionテンプレート_から関数ポインタを返したい場合、返されるシグネチャはテンプレート引数に依存します。 (あなたは '恒常型形質'を使って '回避することができます') – sehe

+0

PS。または、もちろん、C++の11のレイト・リターン・タイプです。テンプレート<...> auto foo() - > int(*)(void) 'はうまく動作します – sehe

5

typedefの使用を避けると難しいです。例えば、C標準からsignal()を考慮してください。

extern void (*signal(int, void (*)(int)))(int); 

void handler(int signum) 
{ 
    ... 
} 

if (signal(SIGINT, SIG_IGN) != SIG_IGN) 
    signal(SIGINT, handler); 

のtypedefを使用して、それは簡単です:signal()機能のために、あなたは通常、単に<signal.h>を使用すると、システムが心配しましょうということ

typedef void Handler(int); 
extern Handler *signal(int, Handler *); 

void handler(int signum) 
{ 
    ... 
} 

if (signal(SIGINT, SIG_IGN) != SIG_IGN) 
    signal(SIGINT, handler); 

は注意それを宣言する。

+1

typedefの例では、(* Handler )、次にextern Handler signal(int、Handler)としてシグナルしますか? Cでの関数ポインタの構文は、IMHOであり、まったく同じように動作する2つの異なる構文があります。 – Spidey

+1

@Spidey:あなたが示唆しているのは、それを行う典型的な方法ですが、それは正しく動作します。利点は、宣言内のポインタを見ることができることです。どちらも動作します。 –

+0

Cool。私にとって最も大変なことは(main ==&main)本当です。古いコードベースとの互換性のためにこれはおそらくそうですが、もし私がコード標準を定義しようとするなら、それはどの表記を使用するのかを明示するのが最初のポイントになります。 – Spidey

1

あなたは第二のtypedefをしたくない場合は、

typedef float(*(*fptr_t)(int))(double) 

これは "declare fptr_t as pointer to function (int) returning pointer to function (double) returning float" を意味します(fptr_t:int型→(ダブル→フロートを))

+0

宣言はうまく見えますが、割り当てについては不明であり、このポインタを使用してファンクションを呼び出すことはできません。通常の関数ポインタを呼び出すのと同じですか?また、plsは私に非常にはっきりと理解させるコードスニペットを与えます。 – vijayanand1231

関連する問題