- 締切済み
コールバック関数とは…(C言語)
関数をコールバックするのと、 関数を直接呼ぶのとではどう違うのでしょうか? ※質問がおかしかったらすいません。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- higeG
- ベストアンサー率22% (4/18)
コールバック関数は、「何かしらのフレームワークを作る際に汎用性を高めるため」に使います。 ここで言うフレームワークとは、OSやドライバ、ミドルウェアなど、アプリケーションプログラムが使用する共通モジュールを指します。 これらのフレームワークを設計する際には、個々のアプリケーションが何をするプログラムなのかは分かっていないので、 その関数を実行する手順やタイミングだけ決めておき、実際に何をするかはアプリケーションのプログラマに委ねられます。 前出のウィンドウプロシージャ(WinProc)は、Windowsからイベントを受信した時の処理を、 qsortは渡された配列の並べ替えをする時の大小比較の仕方をアプリケーションプログラマが決められるようにする訳です。 フレームワークの設計者(Windowsの設計者やANSI C言語を考えた人達)は、その仕組みを提供しているだけです。
- tea_sheep
- ベストアンサー率53% (8/15)
コールバック関数は、システムや呼び出し先の関数が呼び出し返してくる アプリケーション定義の関数のことです。 代表的なのは、C標準関数のクイックソートqsort関数の第4引数に渡す 比較用関数ですね。qsortは、並べ替え処理の実行中に、要素の順序を決定 するために、アプリ側が準備している比較用関数を呼び出し返してきます。 Windowsだと、No2の方が示されているウィンドウプロシージャだとか、 「Enum***」系のAPIに渡すアプリ定義の関数が該当します。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★『WindowProc』は最も代表的なコールバック関数です。 ・このウインドウ・プロシージャ関数は通常、WinMain() 関数のメッセージ・ループ内で 呼び出されます。Windows からメッセージ情報がメッセージ・キューへ入ると1つ1つを 取り出してコールバック関数である『WindowProc』を呼び出します。これを行っているのが 『DispatchMessage()』関数です。この関数がコールバック関数のウィンドウ・プロシージャを 内部で呼び出して、送出したメッセージを『WindowProc』に処理させるのです。 ・つまり、コールバック関数とは『勝手に呼ばれる関数』と思えば分かりやすいです。 これに対して関数を直接呼び出すのは、プログラマーの意思で任意の位置で呼び出します。 プログラマーが呼び出さない限りは関数の『処理』は行いません。 ・よって違いは、Windows などのシステムが内部で呼び出す関数を『コールバック関数』と呼び、 プログラマーさんからしか呼び出す事がない関数を『直接呼ぶ普通の関数』となります。 最後に: ・コールバック関数はたくさんあります。 ・例えば SetTimer() の第4引数の『TIMERPROC』型の『lpTimerFunc』がそれにあたります。 これはセットしたタイマー間隔毎にコールバック関数である『lpTimerFunc』関数を Windows システムが勝手に呼び出します。もちろん、プログラマーの意思で直接呼び出しても 構いません。→必要に応じて呼び出せばよいのです。 ・『コールバック関数』を内部で呼び出す関数や処理は、必ず最初にセット(登録)しないと その後に実行されませんので注意して下さい。→セット(登録)などは関数のアドレス(ポインタ)を 引数などに渡すことになります。『コールバック関数』とは『Callback Function』です。 『Call』が呼び出すという意味です。 ・以上。参考に!
- oldroot2005
- ベストアンサー率66% (68/103)
「コールバック関数」とは、通常「何かあったときにどこかから呼ばれる関数」という意味になります。コードとしては以下のような感じになります。 直接関数を呼ぶ: void func(); func(); /* 関数呼び出し */ コールバック関数: void subscribe(void (*)()); void callback(); /* コールバック関数 */ subscribe(callback); /* コールバック関数の登録。ここではまだ callback() は呼ばれない */ コールバック関数を「誰が」「どのような時に呼び出すか」は、フレームワーク(上の例だと subscribe)の仕様次第なので、何とも言えません。