mingw:从lambda到函数指针的转换无效

时间:2017-10-29 13:18:34

标签: c++ c++11 winapi lambda mingw

使用mingw 5.3.0进行编译时,尝试将lambda作为函数指针提供给Win32 API调用失败,尽管在使用MSVC(Visual Studio 2013)时它编译得很好。

MCVE:

#include <Windows.h>

int main(int argc, char *argv[])
{
    bool parameterData;

    EnumWindows([](HWND windowHandle, LPARAM parameter) -> BOOL {
        return 1;
    }, reinterpret_cast<LPARAM>(&parameterData));
}

GCC抛出以下错误消息,我无法解决这个问题:

error: invalid user-defined conversion from 'main(int, char**)::<lambda(HWND, LPARAM)>' to 'WNDENUMPROC {aka int (__attribute__((__stdcall__)) *)(HWND__*, long int)}' [-fpermissive]
  }, reinterpret_cast<LPARAM>(&parameterData));
                                             ^
note: candidate is: main(int, char**)::<lambda(HWND, LPARAM)>::operator BOOL (*)(HWND, LPARAM)() const <near match>
  EnumWindows([](HWND windowHandle, LPARAM parameter) -> BOOL {
                                                         ^
note:   no known conversion from 'BOOL (*)(HWND, LPARAM) {aka int (*)(HWND__*, long int)}' to 'WNDENUMPROC {aka int (__attribute__((__stdcall__)) *)(HWND__*, long int)}'
In file included from C:/Qt/Tools/mingw530_32/i686-w64-mingw32/include/Windows.h:72:0,
                 from main.cpp:1:
note:   initializing argument 1 of 'WINBOOL EnumWindows(WNDENUMPROC, LPARAM)'
   WINUSERAPI WINBOOL WINAPI EnumWindows(WNDENUMPROC lpEnumFunc,LPARAM lParam);

海湾合作委员会不喜欢什么?需要更改什么才能将lambda用作EnumWindows的第一个参数?

1 个答案:

答案 0 :(得分:1)

int my = s.wrapper(&student::fun1, 1); cout << my << endl; 期望使用EnumWindows调用约定进行回调。 GCC不支持将无状态lambda转换为stdcall函数指针,并且我没有意识到将lambda标记为这样。但是,MSVC为具有各种调用约定的函数指针提供转换。

不幸的是,您将不得不使用单独的功能或使用MSVC:

stdcall