C には「コールバック」はありません。他のジェネリック プログラミングの概念と同じです。
それらは関数ポインタを使用して実装されています。以下に例を示します:
void populate_array(int *array, size_t arraySize, int (*getNextValue)(void))
{
for (size_t i=0; i<arraySize; i++)
array[i] = getNextValue();
}
int getNextRandomValue(void)
{
return rand();
}
int main(void)
{
int myarray[10];
populate_array(myarray, 10, getNextRandomValue);
...
}
ここでは、populate_array
function は関数ポインターを 3 番目のパラメーターとして取り、それを呼び出して配列に入力する値を取得します。コールバック getNextRandomValue
を書きました 、ランダムっぽい値を返し、それへのポインターを populate_array
に渡しました . populate_array
コールバック関数を 10 回呼び出し、返された値を指定された配列の要素に割り当てます。
C でのコールバックの例を次に示します。
イベントが発生したときにコールバックを登録できるようにするコードを書きたいとしましょう。
まず、コールバックに使用する関数のタイプを定義します:
typedef void (*event_cb_t)(const struct event *evt, void *userdata);
ここで、コールバックの登録に使用される関数を定義します:
int event_cb_register(event_cb_t cb, void *userdata);
コールバックを登録するコードは次のようになります:
static void my_event_cb(const struct event *evt, void *data)
{
/* do stuff and things with the event */
}
...
event_cb_register(my_event_cb, &my_custom_data);
...
イベント ディスパッチャーの内部では、コールバックは次のような構造体に格納される場合があります。
struct event_cb {
event_cb_t cb;
void *data;
};
コールバックを実行するコードは次のようになります。
struct event_cb *callback;
...
/* Get the event_cb that you want to execute */
callback->cb(event, callback->data);
簡単なコールバック プログラム。それがあなたの質問に答えてくれることを願っています.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include "../../common_typedef.h"
typedef void (*call_back) (S32, S32);
void test_call_back(S32 a, S32 b)
{
printf("In call back function, a:%d \t b:%d \n", a, b);
}
void call_callback_func(call_back back)
{
S32 a = 5;
S32 b = 7;
back(a, b);
}
S32 main(S32 argc, S8 *argv[])
{
S32 ret = SUCCESS;
call_back back;
back = test_call_back;
call_callback_func(back);
return ret;
}