2012-05-10 23 views
5

Khi tôi cố gắng biên dịch sau đây trên MinGW 4.6.2EnumChildWindows và lambda

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

tôi nhận được

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

Tôi tuyên bố lambda không đúng cách, hoặc là này đơn giản là không đi làm? Định nghĩa MS của callback là

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

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

là quy ước gọi gây ra vấn đề?

+0

http://stackoverflow.com/questions/2935201/will-c0x-support-stdcall-or-extern-c-capture-nothing-lambdas có liên quan. –

Trả lời

6

BOOL CALLBACK EnumChildProc (...)

Đó là vấn đề, macro CALLBACK áp dụng thuộc tính __stdcall đến chức năng để thay đổi quy ước gọi từ các thiết lập mặc định. Đó là __cdecl trong hầu hết các chương trình. Bạn không thể kiểm soát quy ước gọi cho lambda của bạn, ngoài việc thay đổi thiết lập chung (tùy chọn biên dịch/Gz). Điều đó có thể có nhiều tác dụng phụ hơn bạn quan tâm, hãy từ bỏ lamda này.

Không phải là sự cố trong mã btw 64 bit.

+1

@ luksy: Cũng lưu ý rằng VC++ 11 xử lý điều này cho bạn hoàn toàn (tức là, nó chỉ hoạt động). – ildjarn

Các vấn đề liên quan