【问题标题】:how to specify vc11 lambda calling convention如何指定 vc11 lambda 调用约定
【发布时间】:2012-12-19 14:36:52
【问题描述】:

我想将嵌套在类中的 lambda 函数指针传递给 Windows API 回调函数。我发现没有地方可以指定__stdcall 关键字。有人告诉我编译只支持__cdecl,但是我用nm命令转储obj文件后,发现编译会同时生成三个辅助函数(__stdcall__cdecl__fastcall)。所以我的问题是,如何指定调用约定?

以下代码是我的测试代码。

#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
    auto func = [](){};
    return 0;
}
00000000 t ?<helper_func_cdecl>@<lambda_5738939ec88434c53e1a446c47cf2db6>@@CAXXZ
00000000 t ?<helper_func_fastcall>@<lambda_5738939ec88434c53e1a446c47cf2db6>@@CIXXZ
00000000 t ?<helper_func_stdcall>@<lambda_5738939ec88434c53e1a446c47cf2db6>@@CGXXZ
00000000 t ??B<lambda_5738939ec88434c53e1a446c47cf2db6>@@QBEP6AXXZXZ
00000000 t ??B<lambda_5738939ec88434c53e1a446c47cf2db6>@@QBEP6GXXZXZ
00000000 t ??B<lambda_5738939ec88434c53e1a446c47cf2db6>@@QBEP6IXXZXZ
00000000 t ??R<lambda_5738939ec88434c53e1a446c47cf2db6>@@QBEXXZ

【问题讨论】:

    标签: c++ visual-c++ c++11 lambda calling-convention


    【解决方案1】:

    投射它:

    WinApiFunc(static_cast<void(__stdcall *)()>(func));
    

    或者先存入局部变量:

    void (__stdcall *funcp)() = func;
    WinApiFunc(funcp);
    

    【讨论】:

    • 现在我遇到了另一个问题:当我使用这种语法时,我无法捕获任何变量,例如:auto func = [this](){}; void (__stdcall * funcp)() = func;
    • @user1948596 :这与调用约定完全无关——只有 captureless lambda 可以转换为函数指针(否则如何维护状态?)。接受回调的 WinAPI 函数也总是有一个void*/LPVOID 状态参数;使用该参数传递this(再次static_cast)。
    • 谢谢,我用DWORD类型传递this指针,成功了。
    • @user1948596 : DWORD 只能在 32 位平台上工作 - 不可可移植。您具体使用的是哪个 API?可能有更直接的方法...
    • RasDial API 并将this 指针存储在RASDIALPARAMS.dwCallbackId
    猜你喜欢
    • 1970-01-01
    • 2011-06-17
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 2013-05-27
    • 1970-01-01
    相关资源
    最近更新 更多