gpt4 book ai didi

C++ 类成员函数到 C 结构函数指针

转载 作者:太空宇宙 更新时间:2023-11-04 03:22:46 25 4
gpt4 key购买 nike

我正在尝试用 C++ 制作 C 包装器。

但我无法将类中的函数转换为结构函数指针。

myCallback 函数不应作为静态函数使用,因为它必须被覆盖。

示例代码如下:

#include <iostream>

extern "C" {
typedef struct _client_config
{
void (*on_connect)(void *client, int result);
} client_config;
}

class Parent
{
public:
Parent() {};
~Parent() {};

virtual void myCallback(void* hello, int world) = 0;
};

class Child : public Parent
{
public:
Child() {};
~Child() {};

void myCallback(void* hello, int world)
{
printf("Hello World! \n");
}
};

int main(void)
{
Parent* myClass = new Child();

client_config* myClientConfig = (client_config *)malloc(sizeof(client_config));

myClientConfig->on_connect = myClass->myCallback;

return 0;
}

这是编译器在编译过程中所说的:

Error   1   error C3867: 'Parent::myCallback': function call missing argument list; use '&Parent::myCallback' to create a pointer to member
Error 2 error C2440: '=' : cannot convert from 'void (__thiscall Parent::* )(void *,int)' to 'void (__cdecl *)(void *,int)'

谁能指出一种将类成员函数绑定(bind)到结构函数指针的方法或者我在这里做错了什么?

最佳答案

C 库的函数指针仅与 extern "C" 自由函数兼容。 (即使是静态成员函数也不兼容,语言链接是错误的)。

你必须使用像蹦床这样的功能,询问你收到一个指向你的对象所在位置的指针的对象(库确实为你提供了一种方法来存储某种形式的用户数据,这些数据可以被检索在回调中,不是吗?也许那个 client 参数是这样的,你必须阅读文档。),转换为 Parent* ,并执行成员调用。编译器不会为你做这些。

extern "C" void connect_trampoline( void* client, int result )
{
Parent* my_object = static_cast<Parent*>(client);
my_object->myCallback(result);
}

myClientConfig->on_connect = &connect_trampoline;

通常对 C++ 库进行编码以简化此操作,例如,通过接受可以携带其自身状态的 std::function。但是在 C 库使用的 C 编程风格中,您必须在使用成员之前找到您的对象并进行丑陋的转换。

如果库没有使回调可以访问您控制下的某种形式的指针,但确实将指针传递给与回调关联的库对象,您可以使用全局 std::map<library_object*, Parent*>查找您的对象。这种方法也避免了转换。


请注意,当您将指向您的对象的指针交给库为您保存时,您给它的类型(在本例中为 Parent*)与您稍后将转换回的类型完全相同。如果你给一个 Derived* ,效果就是做 reinterpret_cast<Parent*>(p_derived) ,这是非常糟糕的。 (当给出指向库的指针时,static_castvoid*,当你取回它时,static_castParent*,C++ 标准说这个序列与 reinterpret_cast 的行为完全相同)

关于C++ 类成员函数到 C 结构函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43928390/

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