मैं एक लम्बा फ़ंक्शन पॉइंटर पास करना चाहता हूं, जो क्लास में घोंसला हुआ है, विंडोज एपीआई कॉलबैक फ़ंक्शन में। मैंने पाया कि __stdcall
कीवर्ड निर्दिष्ट करने के लिए मेरे पास कोई जगह नहीं है। कुछ लोगों ने मुझे बताया संकलन केवल __cdecl
समर्थन करते हैं, लेकिन बाद मैं एनएम आदेश इस्तेमाल किया obj फ़ाइल डंप करने के लिए, मैंने पाया संकलन तीन सहायक समारोह (__stdcall
, __cdecl
, __fastcall
) समवर्ती उत्पन्न होगा। तो मेरी समस्या यह है कि मैं कॉलिंग सम्मेलन को कैसे निर्दिष्ट कर सकता हूं?vc11 lambda कॉलिंग सम्मेलन को निर्दिष्ट करने के लिए कैसे करें
निम्नलिखित कोड मेरे परीक्षण कोड हैं।
#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
ईमानदारी से धन्यवाद, यह काम करता है !!! –
और अब मैं एक और समस्या को पूरा करता हूं: जब मैं इस वाक्यविन्यास का उपयोग करता हूं, तो मैं इस तरह के किसी भी चर को नहीं पकड़ सकता: 'auto func = [this]() {}; शून्य (__stdcall * funcp)() = func; ' –
@ user1948596: यह सम्मेलनों को कॉल करने के लिए पूरी तरह से असंबंधित है - केवल _captureless_ lambdas फ़ंक्शन पॉइंटर्स में परिवर्तनीय हैं (राज्य को और कैसे बनाए रखा जा सकता है?)। WinAPI फ़ंक्शन जो कॉलबैक लेते हैं, उनके पास हमेशा 'शून्य * '/' LPVOID' राज्य पैरामीटर होता है; 'this' (' static_cast' फिर से) पास करने के लिए उस तर्क का उपयोग करें। – ildjarn