こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

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

投稿日時 - 2007-03-31 23:33:51

QNo.2883627

暇なときに回答ください

このQ&Aは役に立ちましたか?

5人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

コールバック関数は、「何かしらのフレームワークを作る際に汎用性を高めるため」に使います。
ここで言うフレームワークとは、OSやドライバ、ミドルウェアなど、アプリケーションプログラムが使用する共通モジュールを指します。

これらのフレームワークを設計する際には、個々のアプリケーションが何をするプログラムなのかは分かっていないので、
その関数を実行する手順やタイミングだけ決めておき、実際に何をするかはアプリケーションのプログラマに委ねられます。

前出のウィンドウプロシージャ(WinProc)は、Windowsからイベントを受信した時の処理を、
qsortは渡された配列の並べ替えをする時の大小比較の仕方をアプリケーションプログラマが決められるようにする訳です。
フレームワークの設計者(Windowsの設計者やANSI C言語を考えた人達)は、その仕組みを提供しているだけです。

投稿日時 - 2007-04-02 04:43:30

ANo.3

コールバック関数は、システムや呼び出し先の関数が呼び出し返してくる
アプリケーション定義の関数のことです。

代表的なのは、C標準関数のクイックソートqsort関数の第4引数に渡す
比較用関数ですね。qsortは、並べ替え処理の実行中に、要素の順序を決定
するために、アプリ側が準備している比較用関数を呼び出し返してきます。

Windowsだと、No2の方が示されているウィンドウプロシージャだとか、
「Enum***」系のAPIに渡すアプリ定義の関数が該当します。

投稿日時 - 2007-04-01 11:59:49

ANo.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

投稿日時 - 2007-04-01 00:55:29

ANo.1

「コールバック関数」とは、通常「何かあったときにどこかから呼ばれる関数」という意味になります。コードとしては以下のような感じになります。

直接関数を呼ぶ:
 void func();
 func(); /* 関数呼び出し */

コールバック関数:
 void subscribe(void (*)());
 void callback(); /* コールバック関数 */
 subscribe(callback); /* コールバック関数の登録。ここではまだ callback() は呼ばれない */

 コールバック関数を「誰が」「どのような時に呼び出すか」は、フレームワーク(上の例だと subscribe)の仕様次第なので、何とも言えません。

投稿日時 - 2007-03-31 23:59:47

あなたにオススメの質問