• 締切済み

コールバック関数とは…(C言語)

関数をコールバックするのと、 関数を直接呼ぶのとではどう違うのでしょうか? ※質問がおかしかったらすいません。

みんなの回答

  • higeG
  • ベストアンサー率22% (4/18)
回答No.4

コールバック関数は、「何かしらのフレームワークを作る際に汎用性を高めるため」に使います。 ここで言うフレームワークとは、OSやドライバ、ミドルウェアなど、アプリケーションプログラムが使用する共通モジュールを指します。 これらのフレームワークを設計する際には、個々のアプリケーションが何をするプログラムなのかは分かっていないので、 その関数を実行する手順やタイミングだけ決めておき、実際に何をするかはアプリケーションのプログラマに委ねられます。 前出のウィンドウプロシージャ(WinProc)は、Windowsからイベントを受信した時の処理を、 qsortは渡された配列の並べ替えをする時の大小比較の仕方をアプリケーションプログラマが決められるようにする訳です。 フレームワークの設計者(Windowsの設計者やANSI C言語を考えた人達)は、その仕組みを提供しているだけです。

  • tea_sheep
  • ベストアンサー率53% (8/15)
回答No.3

コールバック関数は、システムや呼び出し先の関数が呼び出し返してくる アプリケーション定義の関数のことです。 代表的なのは、C標準関数のクイックソートqsort関数の第4引数に渡す 比較用関数ですね。qsortは、並べ替え処理の実行中に、要素の順序を決定 するために、アプリ側が準備している比較用関数を呼び出し返してきます。 Windowsだと、No2の方が示されているウィンドウプロシージャだとか、 「Enum***」系のAPIに渡すアプリ定義の関数が該当します。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★『WindowProc』は最も代表的なコールバック関数です。 ・このウインドウ・プロシージャ関数は通常、WinMain() 関数のメッセージ・ループ内で  呼び出されます。Windows からメッセージ情報がメッセージ・キューへ入ると1つ1つを  取り出してコールバック関数である『WindowProc』を呼び出します。これを行っているのが  『DispatchMessage()』関数です。この関数がコールバック関数のウィンドウ・プロシージャを  内部で呼び出して、送出したメッセージを『WindowProc』に処理させるのです。 ・つまり、コールバック関数とは『勝手に呼ばれる関数』と思えば分かりやすいです。  これに対して関数を直接呼び出すのは、プログラマーの意思で任意の位置で呼び出します。  プログラマーが呼び出さない限りは関数の『処理』は行いません。 ・よって違いは、Windows などのシステムが内部で呼び出す関数を『コールバック関数』と呼び、  プログラマーさんからしか呼び出す事がない関数を『直接呼ぶ普通の関数』となります。 最後に: ・コールバック関数はたくさんあります。 ・例えば SetTimer() の第4引数の『TIMERPROC』型の『lpTimerFunc』がそれにあたります。  これはセットしたタイマー間隔毎にコールバック関数である『lpTimerFunc』関数を  Windows システムが勝手に呼び出します。もちろん、プログラマーの意思で直接呼び出しても  構いません。→必要に応じて呼び出せばよいのです。 ・『コールバック関数』を内部で呼び出す関数や処理は、必ず最初にセット(登録)しないと  その後に実行されませんので注意して下さい。→セット(登録)などは関数のアドレス(ポインタ)を  引数などに渡すことになります。『コールバック関数』とは『Callback Function』です。  『Call』が呼び出すという意味です。 ・以上。参考に!

参考URL:
http://www7a.biglobe.ne.jp/~lshen/EternalWindows/WinBase/Base/Base06.html
回答No.1

「コールバック関数」とは、通常「何かあったときにどこかから呼ばれる関数」という意味になります。コードとしては以下のような感じになります。 直接関数を呼ぶ:  void func();  func(); /* 関数呼び出し */ コールバック関数:  void subscribe(void (*)());  void callback(); /* コールバック関数 */  subscribe(callback); /* コールバック関数の登録。ここではまだ callback() は呼ばれない */  コールバック関数を「誰が」「どのような時に呼び出すか」は、フレームワーク(上の例だと subscribe)の仕様次第なので、何とも言えません。

関連するQ&A