visual c++ - When to use calling conventions -
अलग कॉलिंग सम्मेलनों का उपयोग करने पर प्रमुख कारक क्या हैं?
वास्तव में अनुमोदित हो।
ज्यादातर समय आपको इसके बारे में चिंता करने की ज़रूरत नहीं है आम तौर पर आप __ cdecl
का उपयोग करेंगे, लेकिन केवल इसलिए कि यह दृश्य सी ++ में डिफ़ॉल्ट है सी ++ सदस्य कार्यों, हालांकि, दृश्य सी ++ में डिफ़ॉल्ट रूप से __ इसका
सम्मेलन का उपयोग करें
ए (बल्कि आम) स्थिति जहां आपको वास्तव में फोन करने वाले सम्मेलनों की चिंता है, जब आप कॉलबैक को पास करते हैं एपीआई कार्यों, जैसे कि विंडोज़ एपीआई में:
// कॉलबैक # __स्ट्डीक लार्सल्ट कॉलबैक मायवंड प्रोक्र (एचडब्ल्यूएनएच एचडब्ल्यूडी, यूआईएनटी पीडैम, एलएपीआरएम एलपीएएमएम) के रूप में परिभाषित किया गया है; // ... windowClass.lpfnWndProc = और MyWndProc; :: RegisterClass (& amp; windowClass); यहां, हम MyWndProc ()
को __ stdcall
सम्मेलन ( कॉलबैक है #define
'd as as __ stdcall
)। यह आवश्यक है क्योंकि ऑपरेटिंग सिस्टम को उम्मीद है कि lpfnWndProc
एक WNDPROC
को इंगित करता है,।
बस के बारे में हर विंडोज़ एपीआई फ़ंक्शन जो कॉलबैक स्वीकार करता है, कॉलबैक की आवश्यकता होती है __ stdcall
कन्वेंशन का उपयोग करने के लिए फ़ंक्शन, और चूंकि __ cdecl
आमतौर पर डिफ़ॉल्ट है, आपको इसे स्पष्ट करना चाहिए (आप विंडो कोड प्रक्रियाओं के लिए callback
का उपयोग करेंगे) ।
यह अत्यंत महत्वपूर्ण है क्योंकि स्टैक भ्रष्टाचार हो सकता है यदि ऑपरेटिंग सिस्टम गैर- __ stdcall
फ़ंक्शन को कॉल करने का प्रयास करता है दुर्भाग्य से पर्याप्त लोग इसे गलत मानते हैं।
जबकि WinAPI फ़ंक्शंस को कॉलबैक फ़ंक्शंस के लिए __ stdcall
आवश्यक है, फ़ंक्शन जो कि तर्कों की एक चर संख्या को स्वीकार करते हैं, उन्हें __ cdecl < / कोड> कॉलिंग सम्मेलन, क्योंकि केवल कॉलर को पता चलेगा कि स्टैक से आने वाले तर्कों की चर संख्या को कैसे ठीक से पॉप कर सकते हैं। चूंकि __ cdecl
आमतौर पर डिफ़ॉल्ट है, आपको उन कार्यों के लिए स्पष्ट रूप से __ cdecl
निर्दिष्ट करने की ज़रूरत नहीं है जो तर्कों की एक चर संख्या स्वीकार करते हैं।
मैं व्यक्तिगत रूप से हेवन __ फास्टकॉल
के लिए इसका उपयोग नहीं मिला, हालांकि मुझे यकीन है कि किसी के पास है।
__ clrcall
केवल तभी प्रासंगिक है जब आप प्रबंधित कोड से इंटरैक्ट कर रहे हों
Comments
Post a Comment