アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (4件)

コールバック関数は、「何かしらのフレームワークを作る際に汎用性を高めるため」に使います。


ここで言うフレームワークとは、OSやドライバ、ミドルウェアなど、アプリケーションプログラムが使用する共通モジュールを指します。

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

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

コールバック関数は、システムや呼び出し先の関数が呼び出し返してくる


アプリケーション定義の関数のことです。

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

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

★『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 …
    • good
    • 0

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

コードとしては以下のような感じになります。

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

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

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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!