4

次のプロトタイプを理解するのを手伝ってください。最後は何をしているの(int)

void ( *signal(int sig, void (*handler)(int)) ) (int);
4

6 に答える 6

9

全体が と呼ばれる関数を宣言しますsignal:

  • signalint と関数ポインタを取ります
    • この関数ポインタは を取り、int戻りますvoid
  • signal関数ポインタを返します
    • この関数ポインタは を取り、intを返しますvoid

そこがラストのint出番です。


スパイラル ルールを使用して、そのような宣言またはプログラムを理解できますcdecl(1)

于 2013-04-01T07:41:14.493 に答える
2

最近の別の質問への回答で指摘したように、これらの宣言を理解する 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 を返す関数へのポインター (ハンドラー) です。

または、らせんの法則と同じように、精神的にスワッピングを行うこともできます。

于 2013-04-01T09:39:03.577 に答える
0

void (*handler)(int);handler は、戻り値の型を持つ関数 (Fn1 など) へのポインターでvoidあり、int

void (*signal(int sig, Fn1)) (int);

(*signal(int sig, Fn1);この関数には戻り値の型があり、引数としてandvoidを取ります。intfunction pointer

この関数の戻り値の型。そのポインターは、戻り値の型で[final ] をsignal取る関数の関数ポインターである可能性があります。intintvoid

于 2013-04-01T07:40:41.807 に答える
0

上記のプロトタイプは次のように書くことができます::

typedef void (*sig_t) (int);

sig_t signal(int sig, sig_t handler);

さて、それがあなたにとって明らかであることを願っています。

于 2013-04-01T07:52:39.430 に答える
0

これは、void を返す関数へのポインタを返す関数です。ソース: "Unscrambling C Declarations" in DEEP C SECRETS

于 2013-04-01T08:47:06.990 に答える