重複の可能性:
C++クラスメンバー関数をCコールバック関数として使用する
Cライブラリ(winpcap)を使用してオブジェクト指向ライブラリを作成しています。ネットワークパケットが関数ポインタとして到着したときに呼び出されるコールバック関数を渡す必要があります。メンバー関数ポインターをwinpcapに渡し、デザインオブジェクトの方向を維持し、さまざまなオブジェクトがさまざまなパケットを受信できるようにします。ただし、私が理解している限り、メンバー関数の呼び出し規約は異なるため、C関数に渡すことはできません。これを修正する方法はありますか?boost :: bind(試行錯誤以外ではほとんど使用できません)を使った実験は実り多いものではありません。
メンバー関数の呼び出し規約を変更する方法はありますか?
これは、私が現在使用しているコールバック関数の定義であり、実際にwinpcapに渡すものです。
void pcapCallback( byte* param, const struct pcap_pkthdr* header, const byte* pkt_data );
pcap_loop( adhandle, 0, pcapCallback, NULL );
pcap_loopは、関数の名前を取ります(現時点ではグローバルスコープにあります)。これは、関数ポインタパラメータ(pcap_loopの3番目のパラメータ)の定義です。これはサードパーティのコードなので、実際に変更することはできません。この形式をとることができるメンバー関数が必要になります。
typedef void (*pcap_handler)(u_char *, const struct pcap_pkthdr *, const u_char *);
私が理解している限り、メンバー関数はこの呼び出しを使用し、c関数ポインターはcdeclを必要とします