• ベストアンサー

「void ( *signal(int sig, void (*func)(int)) ) (int)」の (int)

signal関数の書式についてですが、   void ( *signal(int sig, void (*func)(int)) ) (int); 最後に付く(int)は一体何でしょうか? このような関数の書式ははじめて見ました。 UNIX系の何かでしょうか。 回答よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t sighandler); より後半部分のtypedefを置き換えると sighandler_t signal(int signum, void (*sighandler)(int)); つぎに戻り値の部分のtypedefを置き換えると void (*signal(int signum, void (*sighandler)(int)))(int); となります。 ( sighandler_t signal(int signum, void (*sighandler)(int)); の「signal(int signum, void (*sighandler)(int))」をAと置き換えて sighandler_t A; からtypedefを置き換えると void (*A)(int); となり、Aを戻すと void (*signal(int signum, void (*sighandler)(int)))(int); となる。 )

noname#113783
質問者

お礼

戻り値が int の引数1つを持つ関数へのポインタだと! なるほど。難しく考えてました。 回答ありがとうございました!!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • reset_cat
  • ベストアンサー率68% (94/138)
回答No.2

この関数書式の見方は#1さんが回答してますので、割愛します(ぉ この関数書式を日本語に直すと、 「「戻り値のないint型を引数として持つ関数へのポインタ」を戻り値とした、int型と「戻り値のないint型を引数として持つ関数へのポインタ」を引数にもつ関数」 となり、質問の(int)は「戻り値のないint型を引数として持つ関数へのポインタ」の「int型」の部分になります。

noname#113783
質問者

お礼

関数ポインタを戻り値にする場合はこう書くんですね。 わかりやすい回答ありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • signal関数の使い方

    標準関数のsignal()関数についてですが void (*signal(int sig, void (*func)(int)))(int); 関数の形式からしてよくわかりません。 僕のイメージでは関数のポインタというと void (*func)(int,int) という感じですが上の場合 void (*func(int,int))(int) /*引数は仮にint型*/ という形式になってますよね。末尾の(int)は引数のはずですがどこの引数になっているのかよくわかりません。 しかも関数の使用例などをみると signal(SIGINT, func); という形で使っており末尾の(int)がどこにいったのかさっぱりわかりません。 よろしくお願いします。

  • (続)エラー「invalid conversion from `void (*)()' to `void (*)(int)'」

    お手数をお掛けしています。 > die の宣言を > void die(int sig); > にしたのであれば, session_loop の中で die を呼出すときにも引数は必要ですよ. > また, 最後の die の定義のところでも引数を取るようにしていますよね? ←念の為. えーと、下記のように static void die(int); : (中略) : signal(SIGINT, die(1)); : (中略) : /* 端末属性を復旧して終わる */ die(1); } : (中略) : static void die(int) { endwin(); /* 端末属性の復旧 */ exit(0); } としてみたのですが $g++ -o server server.c server.c: function 内の `void session_init(int, char, int, int, char, int, int)': server.c:134: void の値が本来の意味通りに無視されませんでした となってしまいました。 何か勘違いしてますでしょうか??

  • signalについて

    いつもお世話になります。 基本的なことですが、お教えください。 C言語の本に、「signalによる割り込み処理」というプログラムが載っていました。 本の説明では、「UNIXでは、シグナルといったもので、割り込み処理を行うことができます。」と、UNIXの話をしているようです。 私の環境はWindowsですが、かまわずに作って実行してみました。 そのプログラムは以下のとおりです。 #include <stdio.h> #include <signal.h> #include <stdlib.h> /* この行は自分で加えた */ void onsig(int sig) { printf("Control+C\n"); exit(0); } int main(void) { signal(SIGINT, onsig); while(1) { puts("a"); /* ★このputsは自分で加えた ★ */ } return 0; } 意図したとおりに、コントロール+Cを押すと Control+Cが表示されて終わりました。 さて、私はonsig関数の中の exit(0); を削除してみました。 実行すると、はじめたくさんの a が表示され、 コントロール+Cを押すとControl+Cの表示の後すぐにそのままwhileの中に戻っていき、 たくさんのa が表示されて、 再びコントロール+Cを押すとプログラムが終わってプロンプトが戻ってくることがわかりました。 ここで疑問に思ったのは、1回目のコントロール+C の後にすぐにwhileの中に戻っていくのならば、何回 コントロール+Cを押してもwhileの中に戻っていき、コントロール+Cで終わらせることは出来ないのではないか、ということでした。 なぜ2回目のコントロール+Cで終了するのでしょうか。 VC++6.0でWin32 Console Applicationで作成しています。

  • int main(void)

    C言語の問題集をやっているのですが、 本にはmain関数の最初にint main(void)のような書き方が してあります。 学校ではmain() と習ったのですが、本には上のようにかいてあります。 どのように違うのでしょうか? というかmain関数のところに引数が入っている意味がわかりません。 どういうことがというと(void)ってなんですか? またint mainというのはint型の関数だと思うのですが、 なかではdouble型とかも使えます。 お願いします。

  • void*にキャストするのがナンセンス?

    以下のような関数シグネチャがあったとして、 void func(void* v); この関数をコールするときに、以下のようにするのは 笑える行為だと書かれた本がありました。 int i = 0; func((void*)i); これは何がまずいのでしょうか? 本にはその説明がありませんでした。

  • int main()、void main()、void main(void)、int main(void)

    今日、大学でC言語の講義の時間、先生が、 #include <stdio.h> void main(void){ } と宣言してプログラムを書くと教えていました。 main関数には、 main() void main() void main( void ) int main() int main( void ) と、人によりいくつかの描き方があったりします。 どれが本当は正しいのでしょうか? void mainはすべきではないとなんかの本で読んだのですが・・。

  • main()とint main(void)の違い

    最初main()と習ったのですが、最近学校でmain()ではなくint main(void)を使うように なりました。 どのように違うのでしょうか? main関数のところに引数が入っている意味がわかりません。 (void)ってなんですか? そもそも引数って何ですか? あと、プログラムの最後にreturn(0)って書いてあるんですが、これはどういう意味ですか? 回答よろしくお願いします。

  • エラー「invalid conversion from `void (*)()' to `void (*)(int)'」

    皆様、よろしくお願いしたします。RedHat9上で 次のような「鬼ごっこのプログラム」server.cをコンパイルしています。 $ g++ -o server server.c server.c: function 内の `void session_init(int, char, int, int, char, int, int)': server.c:134: invalid conversion from `void (*)()' to `void (*)(int)' というエラーが出てしまいます。 134行というと 「 signal(SIGINT, die);」 なのですが何が間違っているんでしょうか?

  • (void *)と&の違い

    #include<stdio.h> void * func(void *p){ printf("□■□func開始□■□\n"); printf("pのアドレス = %p\n",p); printf("p = %d\n",(int)p); (int)p += 100; printf("p = %d\n",(int)p); printf("□■□func開始□■□\n"); return NULL; } int main(void){ int number = 30; printf("numberのアドレス = %p\n",&number); func((void *)number);★1 return 0; } -------------------------------------------------------------- #include<stdio.h> void * func(int *p){ printf("□■□func開始□■□\n"); printf("pのアドレス = %p\n",p); printf("p = %d\n",*p); *p += 100; printf("p = %d\n",*p); printf("□■□func開始□■□\n"); return NULL; } int main(void){ int number = 30; printf("numberのアドレス = %p\n",&number); func(&number);★2 return 0; } 上記の2つは同じ結果になるのですが★1と★2のそれぞれの違いがわかりません。どなたかご教授をお願いします。

  • int main(void) の意味について教えて下さい

     お早う御座います、Cの初心者です、宜しくお願いします。  最初にmain関数は、「int main(void)」という風に始まりますが 、main関数がstring型をとる場合とか、実際に他の関数から呼ばれる場合は有るのでしょうか。