- ベストアンサー
コールバックって何?
はじめまして、_IXTLと申します。 仕事場でコールバック関数という言葉を聞きました。 呼び出し先にあらかじめ呼び出す関数を覚えさせておく 手法(うろおぼえ)とか…何とか…。 (確か、複数の関数ポインタのテーブルを持たせていたような気がします) Wikipediaなどでも調べましたが、意味が分かりません。 この意味や、メリットなどを詳しく教えて頂けないでしょうか? お願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> 意味 関数を呼び出すのではなく、むこうから呼びだしてもらうこと。 > メリット こちらは「"何が起こったか"はわからないが、そのとき"どうすればいいか"は知っている」 むこうは「"何が起こったか"はわかるが、そのとき"どうすればいいか"はわからない」 とき、「どうすればいいか」をむこうに教えてあげます。 簡単な例: #include <stdio.h> typedef int (*callback_t)(int, int); int execute(callback_t f, int x, int y) { return (*f)(x,y); } int add(int x, int y) { return x + y; } int mul(int x, int y) { return x * y; } int main() { /* 引数 2, 3 で add を呼び、結果を返せ */ printf("add(2,3) = ", execute(&add,2,3)); /* 引数 2, 3 で mul を呼び、結果を返せ */ printf("add(2,3) = ", execute(&mul,2,3)); }
その他の回答 (2)
- toda hiro(@hiro_knigh)
- ベストアンサー率39% (59/151)
基本的には#1さんの回答で十分と思うのですが、メリットがよく分からないという事なので補足します。 たとえば、自分一人でwindowsのように画面にボタンを表示しマウスやキーボードからの入力を受付け、表示したボタンを押下したら別のプログラムが起動するようなプログラムを組むとします。 そうした場合、画面にボタンを表示する処理やマウスの移動などを感知するためハードウェアに近いレベルでのプログラムを組まなければいけません。 それは膨大な量のソースコード量になるでしょう。 それでは時間も勿体無いので、共通出来る部分はシステム側にやってもらうようにします。 ●システム側での処理 (1)アプリ側から指定された領域にボタンを表示 (ボタン上でマウスがクリックされた際に呼出すアプリ側の関数を記憶) (2)ボタン上でマウスがクリックされた際にアプリ側から指定された関数をコール ●アプリ側の処理 (1)指定された領域にボタンを表示するようシステム側に依頼 (ボタン上でマウスがクリックされた際に呼出す関数を同時に指定) (2)ボタン上でボタンを押下された時に行う処理を記述 こうすると、アプリ側はボタンを表示する依頼をする処理とボタンを押下された時に行う処理のみを記載すれば良い事になります。 結果的にコールバック関数というのは、全体のコード量を減らすことや、共通出来る処理はシステム側にやってもらう事で処理を簡潔にする為に用意されていると思って問題ないと思います。
お礼
回答ありがとうございます。 なるほど、おぼろげながら イメージが掴めてきました。 実際にコールバック関数を作成、利用してみて 理解を深めたいと思います。 他の回答者の方もありがとうございました。 今後もこのカテゴリにて質問すると思いますので、 よろしくお願いいたします。
- jacta
- ベストアンサー率26% (845/3158)
例えば、qsortやbsearchに渡す比較関数もコールバック関数です。 特定の状況で(上記の例では比較が必要になった場合)、どんな処理を行うのかをあらかじめ決められないような場合に、ユーザー定義の処理方法を渡してもらうテクニックです。 Cの場合は関数へのポインタを渡すのが一般的ですが、C++では関数オブジェクトを渡すほうが一般的です。 なお、コマンドとなる数値や文字列を渡す場合も、基本的な考え方としては同じですが、既存のいくつかのパターンしか対応できないことと、呼び戻しているわけではないので、コールバックという言い方は普通しません。
補足
回答ありがとうございます。 たとえば…… あらかじめ関数のアドレスを記録したテーブルを もつ下位関数(呼び出し先)があるとします。 「上位関数(呼び出し元)が、テーブル内の 任意の関数を特定するパラメータを渡して 下位関数を呼びだし、下位関数が受け取ったパラメータ を使用しテーブル検索を行って、指示された関数を 呼び出す」 という場合にも、下位関数はコールバック関数となるので しょうか?
補足
回答ありがとうございます。 "上位(呼び出し元)が下位(呼び出し先)に対して 関数のアドレス(関数ポインタ)を渡して、 下位がその関数を呼び出す" という構造でよろしいでしょうか? execute関数のように、自分が呼び出している関数が 何なのかを認識せずに、上位関数から指示された 関数を呼びだすというのが、コールバック関数と いうことでよろしいでしょうか? メリットがよく分かりませんが、汎用的な関数として 使用できるということでしょうか?