C のコールバックとは何ですか? また、それらはどのように実装されていますか?

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;
}