gpt4 book ai didi

c++ - C 兼容的 C++ 回调

转载 作者:太空宇宙 更新时间:2023-11-04 08:42:13 51 4
gpt4 key购买 nike

考虑一个将回调函数(指针)作为参数的库函数。如果使用常规函数指针,则该函数可以与常规 C 和 C++ 函数一起使用,但不能为此使用类方法:

typedef void(*CALLBACK_T)(int);

void testCallback(CALLBACK_T cb){
cb(5);
}

void intOut(int i){
std::cout << i << std::endl;
}

class Test{
public:
void intOut2(int i){
std::cout << "Test: " << i << std::endl;
}
};

void test(void){
testCallback(&intOut);
Test t;
testCallback(&t.intOut2); //won't work
}

我可以使用 std::function 来封装类成员,但这会破坏 C 兼容性。

我能想到的唯一选择是创建一个额外的 context 指向回调处理程序的指针:

typedef void(*CALLBACK2_T)(int, void*);

void testCallback2(CALLBACK2_T cb, void* context){
cb(5, context);
}

但这也需要跟踪上下文信息(回调不会在库函数中直接调用)。

您是否知道如何将回调同时用于 C 函数和 C++ 类成员?

最佳答案

您在这里的回旋余地很小。绝大多数最常用的方法是额外的上下文指针。

一个可行的替代方法是在运行时创建一个 thunk。那就是你分配一些内存并将其标记为可执行文件。然后内存包含调用成员函数所需的指令。调用的主题,即对象实例,位于相对于 thunk 的固定偏移处。这是非常肮脏的工作,而且不完全便携。我不推荐它。

关于c++ - C 兼容的 C++ 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23131764/

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