gpt4 book ai didi

C++ 到 C 调用 : argument of type 'void (MyClass::)(u_char*,)' does not match 'void (*)(u_char*)'

转载 作者:太空狗 更新时间:2023-10-29 23:47:45 25 4
gpt4 key购买 nike

我生疏的 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);
}

error: argument of type ‘void (Sniff::)(u_char*, const pcap_pkthdr*, const u_char*)’ does not match ‘void (*)(u_char*, const pcap_pkthdr*, const u_char*)’

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

++ 另一个问题:

listener = g_thread_create(pcap_listen, NULL, FALSE, NULL);

很多::、& 的变体,这个 .. 已经过测试,最有用的消息是:

src/main.cpp:281: error: argument of type ‘void* (Sniff::)(void*)’ does not match ‘void* ()(void*)’

最佳答案

你不能pass a pointer to a member function to something that's expecting a function pointer .从根本上说,指向成员函数的指针与函数指针是完全不同的类型。两者之间没有简单的转换,也永远不可能是一个,因为没有 this 指针,这是调用非静态成员函数所必需的。

简单地添加 static 也不能从技术上解决问题,因为它没有 C 链接,这可能是符合规范的实现的问题。在大多数实现中,这表现良好,但它通常不可移植,并且可移植解决方案需要使用

extern "C" {
void my_callback() {
}
}

更新:

鉴于您尝试调用的两个函数似乎都采用 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);
}

它不是很漂亮,但它确实有效。

关于C++ 到 C 调用 : argument of type 'void (MyClass::)(u_char*,)' does not match 'void (*)(u_char*)' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4126616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com