5

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

ラムダを間違って宣言していますか、それとも単にうまくいかないのでしょうか? コールバックの 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

呼び出し規約が問題の原因ですか?

4

1 に答える 1

6

BOOL CALLBACK EnumChildProc(...)

それが問題です。CALLBACK マクロは __stdcall 属性を関数に適用して、呼び出し規約をデフォルト設定から変更します。ほとんどのプログラムでは __cdecl です。グローバル設定 (/Gz コンパイル オプション) を変更する以外に、ラムダの呼び出し規約を制御することはできません。それはあなたが気にするよりもはるかに多くの副作用をもたらす可能性があります.このラムダをあきらめてください.

ところで、64ビットコードでは問題ありません。

于 2012-05-10T04:47:47.540 に答える