C++ to C调用:类型'void(MyClass ::)(u_char*,)'的参数与'void(*)(u_char*)'不匹配

kag*_*san 2 c++

我生锈的C++技能在失败之后失败了:

#include <pcap.h>
...
void Sniff::pcap_listen() {
 pcap_t *loc;
 char *dev;
 dev = pcap_lookupdev(errbuf);
 loc = pcap_open_live(dev,BUFSIZ,0,-1,errbuf);
 pcap_loop(loc,-1,pcap_callback,NULL);
}
Run Code Online (Sandbox Code Playgroud)

error:类型'void(Sniff ::)(u_char*,const pcap_pkthdr*,const u_char*)'的参数与'void(*)(u_char*,const pcap_pkthdr*,const u_char*)'不匹配

在.h中添加/删除"静态"定义:无效.

++另一个问题:

listener = g_thread_create(pcap_listen, NULL, FALSE, NULL);
Run Code Online (Sandbox Code Playgroud)

很多变种的::,&,这个......经过测试,最有信息的信息是:

的src/main.cpp中:281:错误:类型无效*(嗅::)(无效*)'的参数不匹配'无效*( )(无效*)'

Fle*_*exo 5

您不能将指向成员函数的指针传递给期望函数指针的东西.从根本上说,指向成员函数的指针是与函数指针完全不同的类型.两者之间没有平凡的转换,因为没有this指针,所以不能一个,这是调用非静态成员函数所必需的.

简单地添加static技术上也没有解决问题,因为它不会有C链接,这可能是符合实现的问题.在大多数实现中,这表现良好,但一般不便携,便携式解决方案需要使用

extern "C" {
   void my_callback() {
   }
}
Run Code Online (Sandbox Code Playgroud)

更新:

鉴于您尝试调用的两个函数似乎都采用void*"用户参数",您可以将其与变量一起使用,以将指针传递给您的类的实例,例如:

class CallbackHandler {
public:
   void my_callback();   
};

extern "C" {
   void callback_wrapper(void *arg) {
      static_cast<CallbackHandler*>(arg)->my_callback();
   }
}

void start_pcap_listen(CallbackHandler* receiver) {
   pcap_t *loc;
   char *dev;
   dev = pcap_lookupdev(errbuf);
   loc = pcap_open_live(dev,BUFSIZ,0,-1,errbuf);
   pcap_loop(loc,-1,callback_wrapper,receiver);   
}
Run Code Online (Sandbox Code Playgroud)

它不漂亮,但它的工作原理.