簡體   English   中英

通過lambda從C ++調用C回調函數

[英]Calling a C callback function from C++ via a lambda

我在一個普通的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'

如果我刪除捕獲'&'它編譯並工作,但我需要捕獲一些位和bobs。

這可能嗎?

由lambda表達式創建的閉包可以隱式轉換為函數指針,但前提是它不捕獲任何變量。 此外,它將轉換為指向extern "C++"函數的指針,而不是extern "C"函數,從技術上講,它們是不兼容的類型。

所以不,你不能這樣做。

一個hacky解決方法是將實際閉包存儲在全局變量中並傳遞一個調用它的回調。 這僅在您的程序是單線程且DoVisitChildren調用不存儲回調供以后使用DoVisitChildren有效。

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

// ...

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM