【问题标题】:mingw: Invalid conversion from lambda to function pointermingw:从 lambda 到函数指针的无效转换
【发布时间】:2017-10-29 13:18:34
【问题描述】:

使用 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);

GCC 不喜欢的到底是什么?为了将 lambda 用作EnumWindows 的第一个参数,需要进行哪些更改?

【问题讨论】:

  • 问题好像是无状态lambda的转换……你们编译器支持吗?

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


【解决方案1】:

EnumWindows 需要使用 stdcall 调用约定的回调。 GCC 不支持将无状态 lambda 转换为 stdcall 函数指针,而且我不知道如何将 lambda 标记为这样。但是,MSVC 提供了对具有各种调用约定的函数指针的转换。

不幸的是,您将不得不使用单独的函数或使用 MSVC:

BOOL CALLBACK callback(HWND windowHandle, LPARAM parameter) { ... }
...
EnumWindows(callback, reinterpret_cast<LPARAM>(&parameterData));

【讨论】:

  • 您知道自从您发布此内容后是否有任何变化?
  • @Paul,我不确定,抱歉。如果编译器设置好了,至少可以很容易地测试是否支持。
猜你喜欢
  • 1970-01-01
  • 2018-10-29
  • 2018-06-15
  • 1970-01-01
  • 1970-01-01
  • 2019-06-18
  • 1970-01-01
  • 2013-11-03
  • 1970-01-01
相关资源
最近更新 更多