gpt4 book ai didi

c++ - 通过 lambda 从 C++ 调用 C 回调函数

转载 作者:行者123 更新时间:2023-11-28 03:11:03 24 4
gpt4 key购买 nike

我在纯 C 静态库中有这段代码:

extern "C" {
typedef void (__cdecl* VisitChildren)(Option*);
void __cdecl DoVisitChildren(Children* List, VisitChildren Visitor);
}

我正在尝试使用 lambda 从一些 C++ 代码(单元测试)中使用它。

...
DoVisitChildren(children, [&] (Option* option) {
...
});

我收到编译器错误 C2664 ... cannot convert parameter 2 from 'unittests::UnitTest1::TestBuild::<lambda_b286d160b9bab3e09ab93cd59fc49f0b>' to 'VisitChildren'

如果我删除捕获 '&' 它编译和工作,但我需要捕获一些点点滴滴。

这可能吗?

最佳答案

由 lambda 表达式创建的闭包可以隐式转换为函数指针,但前提是它不捕获任何变量。此外,它将转换为指向 extern "C++" 函数的指针,而不是 extern "C" 函数,从技术上讲,它们是不兼容的类型。

所以不,你不能这样做。

一个棘手的解决方法是将您的实际闭包存储在一个全局变量中并传递一个调用它的回调。这仅在您的程序是单线程程序并且 DoVisitChildren 调用不存储回调供以后使用时才有效。

std::function<void(Option*)> callback;
extern "C" void __cdecl invoke_callback(Option* o) { callback(o); }

// ...

callback = [&] (Option* option) { /* ... */ };
DoVisitChildren(children, invoke_callback);

关于c++ - 通过 lambda 从 C++ 调用 C 回调函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18489349/

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