2012-12-07 21 views
11

मैं करने के लिए नया हूँ, और सी ++ (जावा का एक बहुत जानते हैं) सीखने और निम्नलिखित कोड मुझे confuses ...सी ++ फंक्शन प्रकार?

enter image description here

मैं जानता हूँ कि इस कोड को टुकड़ा एक सूचक-टू-समारोह के साथ काम कर रहा है (यह एक कॉलबैक है, जो समझ में आता है) लेकिन मुझे जो फेंक रहा है वह रिटर्न प्रकार और फ़ंक्शन नाम के बीच तर्क है। वह खूनी नरक क्या है?

यह एक प्रकार का फ़ंक्शन जैसा दिखता है, लेकिन मैंने कभी इसके बारे में नहीं सुना है और पॉइंटर-टू-फ़ंक्शंस के बारे में खोज और पढ़ने के बाद भी मुझे यह उल्लेख करने में कुछ भी नहीं मिला कि कार्यों में एक प्रकार हो सकता है।

यदि यह सत्य है, तो कोई फ़ंक्शन प्रकार कैसे परिभाषित करता है?

धन्यवाद, -Cody

+2

वह पुस्तक क्या है? और वह कोड सी ++ की तुलना में सी के करीब दिखता है (ऐसा लगता है कि यह ओपनजीएल पुस्तक प्रतीत होता है, जो मुझे आश्चर्य नहीं करता)। –

+1

क्या यह कॉलिंग सम्मेलन नहीं है, जैसा कि stdcall/fastcall/regcall में है ...? –

+0

आप कुछ संकलकों में कॉलिंग सम्मेलनों के साथ एनोटेशन करेंगे। – rerun

उत्तर

10

GLFWCALL एक प्रकार नहीं है, यह एक मैक्रो है जो मंच के लिए विशिष्ट कॉलिंग सम्मेलन में विस्तारित होता है, या एक खाली स्ट्रिंग।

#if defined(_WIN32) && defined(GLFW_BUILD_DLL) 
#define GLFWCALL  __stdcall 
#elif defined(_WIN32) && defined(GLFW_DLL) 
#define GLFWCALL  __stdcall 
#else 
/* We are either building/calling a static lib or we are non-win32 */ 
#define GLFWCALL 
#endif 

एक सही बुला सम्मेलन का प्रयोग किया जाता है 86/Win32 पर महत्वपूर्ण है, क्योंकि उनमें से कुछ उम्मीद ढेर कॉल प्राप्त करने वाला और कॉल करने वाले को दूसरों के द्वारा साफ करने के लिए: यहाँ glfw.h की छंटनी की टुकड़ा है। तर्क पारित करने के क्रम में मतभेद भी हो सकते हैं।

+0

ध्यान दें कि कुछ कॉलिंग सम्मेलन (<4 तर्कों के साथ फास्टकॉल) बिल्कुल स्टैक का उपयोग नहीं करते हैं। –

+1

* जो * फास्टकॉल पर भी निर्भर करता है :) एमएस फास्टकॉल एक्क्स और एडक्स का उपयोग करता है, बोर्लैंड ईएक्स/एडीएक्स/ईसीएक्स, और वाटकॉम चार चार ईएक्स/एडीएक्स/ईबीएक्स/एक्क्स का उपयोग करता है। –

+0

वाट? फास्टकॉल के विभिन्न संस्करण हैं, जिन्हें सभी नामित फास्टकॉल हैं? –

9

Windows पर, GLFWCALL__stdcall के लिए एक मैक्रो है, और अन्य प्लेटफार्मों पर, यह कुछ भी के लिए एक मैक्रो है।

__stdcall एक विशेष कॉलिंग सम्मेलन लागू करता है, और सामान्य सी या सी ++ के शीर्ष पर एक कंपाइलर एक्सटेंशन है।

मैक्रोज़ कोड के टुकड़े हैं जो आपके कंपाइलर के लेक्सर और पार्सर से पहले आपके कोड पर प्रतिस्थापन करते हैं।

6

GLFWCALL एक मैक्रो है जो किसी की आवश्यकता होने पर calling convention तक विस्तार कर सकता है। चूंकि इस फ़ंक्शन को बाहरी कोड द्वारा बुलाया जाएगा, इसलिए इसे कॉलिंग सम्मेलन का उपयोग करना होगा जो बाहरी कोड की अपेक्षा करता है। उदाहरण के लिए, यदि फ़ंक्शन स्टैक पर अपना रिटर्न वैल्यू डालता है और बाहरी कोड इसे एक रजिस्टर में अपेक्षा करता है, तो उछाल।

1

फ़ंक्शन हस्ताक्षर का हिस्सा चिह्नित प्रश्न एक प्रीप्रोसेसर मैक्रो है जिसे शीर्षलेख में कहीं और परिभाषित किया गया है। कुछ प्लेटफार्मों पर कुछ विशेषताओं की अतिरिक्त आवश्यकताएं होती हैं।

उदाहरण के लिए विंडोज प्लेटफॉर्म पर डीएलएल फाइलों में फ़ंक्शन अक्सर __declspec (dllexport) संशोधक का उपयोग करते हैं, लेकिन जब एक ही शीर्षलेख उपयोगकर्ता के प्रोजेक्ट में शामिल होता है तो उन्हें __declspec (dllimport) का उपयोग करने की आवश्यकता होती है। उस उद्देश्य के लिए प्रीप्रोसेसर मैक्रो का उपयोग करना मतलब है कि वे केवल उन मैक्रो का उपयोग सभी प्रासंगिक कार्यों पर कर सकते हैं और अपने स्वयं के डीएलएल या उपयोगकर्ता के डीएलएल और प्लेटफार्मों को संकलित करते समय मैक्रो को अलग-अलग परिभाषित कर सकते हैं जहां __declspec अप्रासंगिक है, इसे कुछ भी परिभाषित नहीं किया जा सकता है। ऐसे मैक्रोज़ के लिए कई अन्य कारण हैं।

इस विशेष मामले में आप प्रभावी ढंग से नाटक कर सकते हैं कि मैक्रो खाली है और इसे पूरी तरह से अनदेखा करें।