4

この記事を読んでいるときに、次の関数ポインターの宣言に出くわしました。私はそのような宣言を扱ったことはありませんが、私がそれを解釈する方法は次のとおりです。逆参照されたときの functionFactory の戻り値は、2 つの int を受け入れて int を返す関数です。

int (*functionFactory(int n))(int, int) {
printf("Got parameter %d", n);
int (*functionPtr)(int,int) = &addInt;
return functionPtr;
}

そのような宣言がこのケースに固有のものなのか、それとも私が見逃した一般的な方法論があるのか​​ 知りたいと思っていました.

つまり、通常、次のような宣言が表示されます

<returnType> funcName(listOfArgs){}

これはリーグ外に表示されます。誰か詳しく教えてください。

4

2 に答える 2

6

通常、次のような宣言が表示されます <returnType> funcName(listOfArgs){}

はい。ただし、この場合、戻り値の型は関数へのポインターであり、これは実際にその種の関数を定義する方法の 1 つです。

int (*functionFactory(int n))(int, int) {
    ...
}

幸いなことに、typedefそれを使用して任意のタイプのエイリアスを作成できるため、はるかに簡単になります。

typedef int (*FncPtr)(int,int);

FncPtr functionFactory(int n) {
    printf("Got parameter %d", n);
    FncPtr functionPtr = &addInt;
    return functionPtr;
}

これははるかに読みやすく、理解しやすいものです。そして、関数プロトタイプの形式は、あなたが期待した通りです:functionFactory型の 1 つの引数を取りint、返すのは呼び出された関数ですFncPtr:)

于 2013-03-26T18:02:46.607 に答える
2

関数へのポインタを返す関数を宣言するには、最初に返す関数の型の宣言を記述します。たとえば、2intを受け取って 1 を返す関数の型intは次のとおりです。

int function(int, int)

次に、 を挿入して関数へのポインターにします*。優先順位が邪魔になるので (括弧で囲まれた関数パラメーターは、よりも強く識別子にバインドされます*)、括弧も挿入する必要があります。

int (*function)(int, int)

最後に、識別子をファクトリ関数の宣言子に置き換えます。(この目的のために、宣言子は関数識別子とパラメーター リストです。) この場合、 に置き換えfunctionますfactory(int)。これは与える:

int (*factory(int))(int, int)

これはfactory(int)、 の場所に適合する何かを返す関数 を宣言します。その場所に適合するのは、2を受け取って を返す関数へのポインターです。xxxint (*xxx)(int, int)intint

于 2013-03-26T18:04:08.680 に答える