How do function pointers in C work?への回答の1つでは、戻り値に関数ポインタを使用する方法について説明しています。ここで問題のコードは次のとおりです。私にとってはCの構文で関数へのポインタを返す
// this is a function called functionFactory which receives parameter n
// and returns a pointer to another function which receives two ints
// and it returns another int
int (*functionFactory(int n))(int, int) {
printf("Got parameter %d", n);
int (*functionPtr)(int,int) = &addInt;
return functionPtr;
}
あなたはfunctionFactory機能は非常に奇妙である宣言する方法 - あなたが戻り値の型(関数へのポインタ)と、関数名自体(functionFactoryをミックスように私には思えます)。例えば
、私たちはその引数の二乗を返す単純な関数を書くときに我々は明らかに、我々は返すものの種類が左側にある
int square(int n){
return n*n;
}
のようなものを書いて、それから、我々は、関数名を書きます次にそれが受け入れるパラメータ。ここで
(int (*function)(int, int)) functionFactory(int n) { ...
リターン(関数へのポインタである)の種類とその内容(例えば、我々が何を指している機能:我々は、関数へのポインタを返すときに、私たちは次のように書いていない理由戻り値とパラメータとして受け入れるもの)が明確に左に区切られており、functionFactory関数自体の名前が右側にあります。私にとって、私のバージョンははるかに論理的で明確であるように見えます。
int (*func)(int, int);
この構文を模倣する機能がCで宣言されている方法構文:
Cは、宣言子にインフィックス表記を使用します。これは「宣言は使用に従う」原則に従う。配列に 'a [5]'としてアクセスするので、int [5] a;ではなくint a [5];として宣言されます。関数型でも同じことが起こっています。 –
'int(* function)(int、int)functionFactory(int n){...' "*ここでは戻り値の型(関数へのポインタ)*"戻り値の型ではない場合は、行? – TessellatingHeckler
もちろん、これらの関数ポインタのtypedefを宣言することができます。そして、これらのtypedefを使った関数宣言は、より "正常"に見えます。 – paddy