C言語Callback(コールバック)関数の実装

Callback関数とは

Callback(コールバック)関数とは呼び直してほしい関数のことです。
言葉の由来は電話のかけ直と同じことから来ているそうです。

電話で例えると、電話をすると相手側の電話機に電話番号が記録されます。相手側は後でその電話番号をたどってかけ直すことができます。

プログラムで言うと、相手側となる他スレッドに対してコールバック関数を登録することで他スレッドから登録されたコールバック関数を呼ぶことができます。

用途・どんな時に使えるの?

主に以下の目的で使用します。

  • 非同期要求に対して応答する
  • 下位モジュールが上位モジュールへ通知する

実装の解説

#include<stdio.h>

typedef void (* CALLBACK_FUNC_POINTER)(char *); //関数ポインタのtypedef
void func1(char *s){
    printf("%s\n",s);
}

void func2(char *s){
    int i;
    for(i=0;i<2;i++){
        printf("%s\n",s);
    }
}

void func(char *s,CALLBACK_FUNC_POINTER p){
    p(s);
}

int main(){
    CALLBACK_FUNC_POINTER p;
    p = func1;
    func("ありがと",p);
    p = func2;

    func("Thanks",p);
    return 0;
}
後にくっそ重要なこと3つ。
1.引数、返り値が同じ関数のアドレスだったら関数ポインタはなんでも格納できる
2.関数ポインタが指してる関数は、”ポインタ(引数)”で呼び出せる
3.1、2から関数ポインタに格納されてる関数のアドレスによって関数を呼び分けられるってことです。
func1,func2は「とっかえひっかえできる関数」だけどそれだとカッコ悪いから我々はそれを
「コールバック関数」と呼ぶのです。
main関数部ではpが格納してる関数アドレスによってfuncは、関数を呼び分けております。
同じように呼ぶだけで処理を変えられるのはメリットだし、
汎用性という観点でも使える技術です。