gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:08:09 26 4
gpt4 key购买 nike

在使用 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 的第一个参数,需要更改什么?

最佳答案

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

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

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

关于c++ - mingw:从 lambda 到函数指针的无效转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47000624/

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