次のプロトタイプを理解するのを手伝ってください。最後は何をしているの(int)
?
void ( *signal(int sig, void (*handler)(int)) ) (int);
次のプロトタイプを理解するのを手伝ってください。最後は何をしているの(int)
?
void ( *signal(int sig, void (*handler)(int)) ) (int);
全体が と呼ばれる関数を宣言しますsignal
:
signal
int と関数ポインタを取ります
int
戻りますvoid
signal
関数ポインタを返します
int
を返しますvoid
そこがラストのint
出番です。
スパイラル ルールを使用して、そのような宣言またはプログラムを理解できますcdecl(1)
。
最近の別の質問への回答で指摘したように、これらの宣言を理解する 1 つの方法は、パラメーター リストと配列宣言子を左側のものと交換し、宣言を逆方向に読むことです。この場合、それはあなたに与えます
void ( *signal(int sig, void (*handler)(int)) ) (int)
->
void (int)( *(int sig, void (int)(*handler))signal )
これは、「`signal は、2 つのパラメーターを受け取り、int パラメーターを受け取り、void を返す関数へのポインターを返す関数です」と読みます。2 つのパラメーターは、int (sig) と、int パラメーターを取り、void を返す関数へのポインター (ハンドラー) です。
または、らせんの法則と同じように、精神的にスワッピングを行うこともできます。
void (*handler)(int);
handler は、戻り値の型を持つ関数 (Fn1 など) へのポインターでvoid
あり、int
void (*signal(int sig, Fn1)) (int);
(*signal(int sig, Fn1);
この関数には戻り値の型があり、引数としてandvoid
を取ります。int
function pointer
この関数の戻り値の型。そのポインターは、戻り値の型で[final ] をsignal
取る関数の関数ポインターである可能性があります。int
int
void
上記のプロトタイプは次のように書くことができます::
typedef void (*sig_t) (int);
sig_t signal(int sig, sig_t handler);
さて、それがあなたにとって明らかであることを願っています。
これは、void を返す関数へのポインタを返す関数です。ソース: "Unscrambling C Declarations" in DEEP C SECRETS