2010-08-04 12 views
6

विभिन्न कॉलिंग सम्मेलनों का उपयोग करने के प्रमुख कारक क्या हैं? किसी को अलग-अलग अवसरों में __cdecl या __stdcall या __fastcall जैसे विशिष्ट कॉलिंग सम्मेलनों का उपयोग करने के बारे में पता है।कॉलिंग सम्मेलनों का उपयोग कब करें

उदाहरण वास्तव में अनुमोदित किए जाएंगे।

उत्तर

12

अधिकांश समय आपको इसके बारे में चिंता करने की आवश्यकता नहीं है। आमतौर पर आप __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 केवल तभी प्रासंगिक है जब आप प्रबंधित कोड से बातचीत कर रहे हों।

संबंधित मुद्दे