【问题标题】:EnumChildWindows and lambdaEnumChildWindows 和 lambda
【发布时间】:2012-05-10 04:16:06
【问题描述】:

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

EnumChildWindows(hwnd, [](HWND, LPARAM) -> BOOL { return TRUE; }, 0);

我明白了

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

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

BOOL CALLBACK EnumChildProc(
  __in  HWND hwnd,
  __in  LPARAM lParam
);

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

调用约定是否导致问题?

【问题讨论】:

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


【解决方案1】:

BOOL CALLBACK EnumChildProc(...)

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

顺便说一句,在 64 位代码中不是问题。

【讨论】:

  • @luksy : 另请注意,VC++11 会为您隐式处理此问题(即它可以正常工作)。
猜你喜欢
  • 1970-01-01
  • 2016-05-24
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多