如何将指向成员函数的指针传递给 C 函数?

6 c c++ function-pointers winpcap calling-convention

可能的重复:
使用 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 );
Run Code Online (Sandbox Code Playgroud)

pcap_loop 只采用函数的名称(目前在全局范围内)。这是函数指针参数(pcap_loop 的第三个参数)的定义。由于这是第三方代码,我无法真正改变它。我必须有一个可以采用这种形式的成员函数:

typedef void (*pcap_handler)(u_char *, const struct pcap_pkthdr *, const u_char *);
Run Code Online (Sandbox Code Playgroud)

据我了解,成员函数将使用 thiscall 而 c 函数指针需要一个 cdecl

Pau*_*l R 5

您只能将static成员函数传递给 C API。

  • @ufotds:虽然您确实可以使用巧妙的技巧来使“静态”成员函数调用非“静态”成员函数,但您也只能将“静态”成员函数(指向)传递给 C API。所以保罗确实是正确的,尽管这比他写的要多。 (2认同)