[C/C++] C言語で関数ポインタ、構造体を使ってインタフェースを定義する



学生時代とは異なり、企業で別々の部署でモジュールを開発している場合にインタフェースを定義し、呼び出して利用することが一般的です。

C++だとインターフェースクラスなどが存在しますが、C言語を利用した場合の一般的な例は次のとおりです。

スポンサードリンク

ソースコード

関数ポインタを利用して宣言されたインタフェースを呼び出して利用するサンプルソースコードです。

#include <stdio.h>




typedef struct Hoge_Interface {

    int  (*Func1)(void);
    void (*Func2)(int num);
    void (*Func3)(const char *chr);

} Hoge_Interface;




void CallModuleB(void* pInterface)
{
    Hoge_Interface* pHoge = (Hoge_Interface*)pInterface;

    // 各インターフェースを条件に応じて呼び出す

    if (pHoge->Func1) pHoge->Func1();
    else              printf("Hoge->Func1 unread.\n");

    if (pHoge->Func2) pHoge->Func2(12345);
    else              printf("Hoge->Func2 unread.\n");

    if (pHoge->Func3) pHoge->Func3("hoge");
    else              printf("Hoge->Func3 unread.\n");

    return;
}




int Hoge_Func1(void)
{
    printf("%s()\n", __FUNCTION__);
    return 0;
}

void Hoge_Func2(int num)
{
    printf("%s() num = %d\n", __FUNCTION__, num);
    return;
}

int main(void)
{
    // インタフェースを定義する
    // Func3 は利用しないとし、NULLとする
    Hoge_Interface Hoge = {
        Hoge_Func1,
        Hoge_Func2,
        NULL,
    };

    // インタフェースのポインタを渡す
    CallModuleB(&Hoge);

    // この関数から使う場合の例
    Hoge.Func1();
    Hoge.Func2(999);

    return 0;
}

ビルド方法

gcc IF_Test.cpp -lstdc++

スポンサードリンク

結果

各関数が呼び出されることを確認できます。

$ ./a.out
Hoge_Func1()
Hoge_Func2() num = 12345
Hoge->Func3 unread.
Hoge_Func1()
Hoge_Func2() num = 999

スポンサードリンク