型違いの関数ポインタを引数に渡す

C、C++では型が違っても(void* (*)(void*))にキャストしてやれば関数ポインタを引数に渡すことができるみたい(さすがに引数の数は揃えなきゃだけど)。


今会社ではWindowsLinuxのマルチスレッドプログラムを作っています。
で、自社制作した子スレッドを作るクラスをライブラリがあって、その中で

  1. 外部ではAFX_THREADPROC関数にて子スレッド化したい関数を作成(UINT (*)(void*)型)
  2. void* (*)(void*)型にキャスト
  3. ライブラリの引数に指定
  4. ライブラリ内でAFX_THREADPROC型にキャスト
  5. スレッドの作成
    • Windows: AfxBeginThread関数の呼び出し
    • gcc: pthread_create関数の呼び出し

ってしていた。これでmakeが通る。

ちなみにこの話はクラスのメンバ関数ではNG(静的メンバ関数は除く)。
多態性によりアドレスが一意に定まらないためなんだと。