14

Forward declaration हमें कार्यान्वयन फ़ाइल तक वास्तविक प्रकार को परिभाषित करने की स्थगित करने देता है। इसे अग्रेषित घोषित प्रकार के पॉइंटर्स या संदर्भों के लिए हेडर में अनुमति है।क्या मेरे रिटर्न प्रकार को परिभाषित करने की आवश्यकता है?

I have been told कि:

मूल्य द्वारा रिटर्निंग प्रकार परिभाषा की आवश्यकता नहीं है। एक आगे घोषणा

कोई पुष्टि या मानक से एक वास्तविक उद्धरण के साथ इस बात से इंकार कर सकते हैं पर्याप्त है? मैं इस धारणा के तहत था कि यह कानूनी नहीं था।

+8

आप, स्पष्ट आप क्या सोचते नहीं कानूनी है हो सकता है वास्तव में? जैसे, एक वास्तविक कोड नमूना आपको लगता है कि अवैध है? – Yakk

+1

यह फ़ंक्शन घोषणाओं पर लागू होता है, परिभाषाएं नहीं। और नहीं, यह मानक से उद्धरण नहीं है। – juanchopanza

+4

शायद मुझे यह कहना चाहिए था कि "मूल्य से लौटने की आवश्यकता नहीं है ** जब आप फ़ंक्शन घोषित करते हैं ** ** आगे की घोषणा पर्याप्त है।" जब आप फ़ंक्शन को परिभाषित करते हैं और जब आप इसे कॉल करते हैं तो आपको परिभाषा की आवश्यकता होती है। –

उत्तर

25

मूल्य से लौटने की आवश्यकता प्रकार की परिभाषा की आवश्यकता नहीं है। एक आगे की घोषणा पर्याप्त है

मूल्य द्वारा लौटाए गए फ़ंक्शन को अस्वीकार करने के लिए प्रकार परिभाषा की आवश्यकता नहीं है। एक अच्छी तरह से गठित डेमो:

struct S; 
S foo(); 
struct S {}; 
int main() { 
    foo(); 
} 
S foo() {} 

मूल्य द्वारा लौटाए गए फ़ंक्शन को परिभाषित या कॉल करने के लिए टाइप परिभाषा की आवश्यकता होती है। स्टैंडर्ड मसौदा [basic.def.odr]:

5 वास्तव में एक वर्ग की एक परिभाषा एक अनुवाद इकाई में आवश्यक है अगर वर्ग एक तरीका है कि वर्ग प्रकार की आवश्यकता है पूरा करने के लिए प्रयोग किया जाता है। [उदाहरण: ... [स्निप] ... [नोट: घोषणाओं और अभिव्यक्तियों के नियमों का वर्णन करता है जिसमें पूर्ण वर्ग प्रकारों के संदर्भों की आवश्यकता होती है। एक वर्ग प्रकार टी होना चाहिए पूरा यदि:

  • [स्निप]
  • 5.9 एक वापसी प्रकार या प्रकार टी का तर्क प्रकार के साथ एक समारोह परिभाषित किया गया है ([basic.def]) या कहा जाता है ([expr .call]), या
  • [स्निप]

अधूरा वापसी प्रकार के साथ एक समारोह की घोषणा परोक्ष सूची में से कोई भी नियम से मना नहीं किया जा रहा के आधार पर अनुमति दी है।

नियम मानक में बाद में फिर से शब्दों में है, और यह एक अपवाद द्वारा छूट दी है [dcl.fct] (धन्यवाद इस नियम ओर इशारा करते हुए के लिए @cpplearner के लिए):

11 प्रकार वापसी में परिभाषित नहीं किया जाएगा या पैरामीटर प्रकार। फ़ंक्शन परिभाषा के लिए पैरामीटर या रिटर्न प्रकार का प्रकार फ़ंक्शन परिभाषा के संदर्भ में अधूरा (संभवतः सीवी-योग्य) वर्ग प्रकार नहीं होगा जब तक कि फ़ंक्शन हटाया नहीं जाता है ([dcl.fct.def.delete])।


एक बीमार गठन डेमो:

struct S; 
S foo(){} // oops 
struct S {}; 

एक और बीमार का गठन डेमो:

struct S; 
S foo(); 
int main() { 
    foo(); // oops 
} 
struct S {}; 
S foo() {} 
+6

उपरोक्त क्योंकि यह ओपी की तलाश में मानक की पुष्टि है। –

+0

दाएं। यदि आप इस बारे में एक कंपाइलर डिज़ाइन परिप्रेक्ष्य से सोचते हैं, तो यह सही समझ में आता है: यदि कंपाइलर को अपना आकार/संरेखण पता होना चाहिए तो प्रकार पूर्ण होना चाहिए। ये अभिव्यक्तियों के लिए कोड जनरेशन में और किसी फ़ंक्शन के लिए रिटर्न स्ट्रक्चर सेट करने में भी महत्वपूर्ण है। लेकिन वे निश्चित रूप से आगे की घोषणा के लिए कोई फर्क नहीं पड़ता, जो जेनरेट कोड में प्रकट नहीं होता है और केवल कंपाइलर की आंतरिक संरचनाओं को अपडेट करता है। – wchargin

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

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