EnumChildWindows和lambda

use*_*267 5 c++ winapi mingw c++11

当我尝试在MinGW 4.6.2上编译以下内容时

EnumChildWindows(hwnd, [](HWND, LPARAM) -> BOOL { return TRUE; }, 0);
Run Code Online (Sandbox Code Playgroud)

我明白了

error: cannot convert '<lambda(HWND, LPARAM)>'
to 'ENUMWINDOWSPROC {aka int (*)(HWND__*,long int)}'
for argument '2' to 'BOOL EnumChildWindows(HWND, ENUMWINDOWSPROC, LPARAM)'
Run Code Online (Sandbox Code Playgroud)

我是否错误地宣布了lambda,或者这根本不起作用?回调的MS定义是

BOOL CALLBACK EnumChildProc(
  __in  HWND hwnd,
  __in  LPARAM lParam
);
Run Code Online (Sandbox Code Playgroud)

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633493%28v=vs.85%29.aspx

调用约定会导致问题吗?

Han*_*ant 6

BOOL CALLBACK EnumChildProc(...)

这就是问题,CALLBACK宏将__stdcall属性应用于函数以从默认设置更改调用约定.在大多数程序中哪个是__cdecl.除了通过更改全局设置(/ Gz编译选项)之外,您无法控制lambda的调用约定.这可能会产生比你更关心的副作用,放弃这个lamda.

在64位代码顺便说一句不是问题.