अधिकांश समय आपको इसके बारे में चिंता करने की आवश्यकता नहीं है। आमतौर पर आप __cdecl
का उपयोग करेंगे, लेकिन केवल इसलिए कि यह दृश्य C++ में डिफ़ॉल्ट है। सी ++ सदस्य फ़ंक्शंस, हालांकि, Visual C++
ए (बल्कि सामान्य) स्थिति में डिफ़ॉल्ट रूप से __thiscall
सम्मेलन का उपयोग करें, जहां आप वास्तव में कॉन्फ़्रेंस कॉल करने के बारे में चिंता करना चाहते हैं, जब आप एपीआई कार्यों में कॉलबैक पास करते हैं, जैसे विंडोज एपीआई में:
// CALLBACK is #define'd as __stdcall
LRESULT CALLBACK MyWndProc(HWND hwnd, UINT msg
WPARAM wParam, LPARAM lParam);
// ...
windowClass.lpfnWndProc = &MyWndProc;
::RegisterClass(&windowClass);
यहाँ, हम __stdcall
सम्मेलन (CALLBACK
#define
है '__stdcall
रूप d) होने के रूप में MyWndProc()
घोषणा करते हैं। इसकी आवश्यकता है क्योंकि ऑपरेटिंग सिस्टम से उम्मीद है कि lpfnWndProc
अंक WNDPROC
, which uses the CALLBACK
convention पर इंगित करता है।
बस हर Windows API समारोह है कि एक कॉलबैक स्वीकार करता है के बारे में कॉलबैक कार्यों __stdcall
सम्मेलन का उपयोग करने की आवश्यकता है, और के बाद से __cdecl
आमतौर पर डिफ़ॉल्ट है, तो आप इस स्पष्ट करना चाहिए (आप विंडो प्रक्रियाओं के लिए CALLBACK
का प्रयोग करेंगे)।
यह बेहद महत्वपूर्ण है क्योंकि ऑपरेटिंग सिस्टम गैर-__stdcall
फ़ंक्शन को कॉल करने का प्रयास करता है तो भ्रष्टाचार का सामना करना पड़ सकता है। दुर्भाग्यवश पर्याप्त लोगों को यह गलत लगता है कि Windows will actually check for calling convention mismatch specifically for window procedures।
__stdcall
कॉलबैक कार्यों WinAPI कार्यों के लिए पारित उन कार्यों को स्वीकार तर्क के परिवर्तनशील, __cdecl
बुला सम्मेलन का उपयोग करना चाहिए, क्योंकि केवल फोन करने वाले को पता चल जाएगा कैसे ठीक ढेर बंद तर्कों की चर संख्या पॉप के लिए आवश्यक है है। चूंकि __cdecl
आमतौर पर डिफ़ॉल्ट है, इसलिए आपको उन तर्कों के लिए __cdecl
स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता नहीं है जो तर्कों की एक चर संख्या स्वीकार करते हैं।
मुझे व्यक्तिगत रूप से __fastcall
के लिए उपयोग नहीं मिला है, हालांकि मुझे यकीन है कि किसी के पास है।
__clrcall
केवल तभी प्रासंगिक है जब आप प्रबंधित कोड से बातचीत कर रहे हों।