2012-05-10 27 views
5

當我嘗試編譯MingW平臺上4.6.2EnumChildWindows和lambda

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)' 

難道我宣佈拉姆達不正確,或者這根本行不通?回調的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

是調用約定導致了問題?

+0

http://stackoverflow.com/questions/2935201/will-c0x-support-stdcall-or-extern-c-capture-nothing-lambdas是相關的。 –

回答

6

BOOL 回調 EnumChildProc(...)

這就是問題所在,回調宏應用__stdcall屬性的功能更改默認設置調用約定。在大多數程序中都是__cdecl。除了通過更改全局設置(/ Gz編譯選項)之外,您無法控制lambda的調用約定。這可能會有比你所關心的更多的副作用,放棄這個lamda。

在64位代碼btw沒有問題。

+1

@luksy:另外請注意,VC++ 11爲你隱式處理(即它只是工作)。 – ildjarn