Desidero passare un puntatore a funzione lambda, che è annidato in una classe, alla funzione di callback dell'API di Windows. Ho trovato che non c'è posto per me per specificare la parola chiave __stdcall
. Alcune persone mi hanno detto che la compilazione supporta solo __cdecl
, ma dopo aver usato il comando nm per scaricare il file obj, ho trovato che la compilazione genererà tre funzioni di supporto (__stdcall
, __cdecl
, __fastcall
) contemporaneamente. Quindi il mio problema è, come posso specificare la convenzione di chiamata?come specificare la convenzione di chiamata lambda vc11
I seguenti codici sono il mio codice di prova.
#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
sinceramente grazie, funziona !!! –
E ora ho incontrato un altro problema: quando uso questa sintassi, non posso catturare nessuna variabile, come questa: 'auto func = [this]() {}; void (__stdcall * funcp)() = func; ' –
@ user1948596: Non è del tutto estraneo alle convenzioni di chiamata - solo _captureless_ lambda sono convertibili in puntatori di funzione (in quale altro modo si potrebbe mantenere lo stato?). Le funzioni WinAPI che accettano i callback hanno sempre anche un parametro di stato 'void *'/'LPVOID'; usa questo argomento per passare 'this' (' static_cast' ancora una volta). – ildjarn