2015-08-24 5 views
5

मैं सी ++ प्राइमर (5 वां संस्करण) के माध्यम से काम कर रहा हूं, और जब तक यह वास्तव में बहुत अच्छी सामग्री रही है, मुझे कुछ मामलों में लगता है कि मैं सिर-खरोंच स्पष्टीकरण में भाग लेता हूं जो मुझे उत्तर से अधिक प्रश्न देता है।इनलाइन फ़ंक्शंस में एकाधिक समान परिभाषा क्यों होंगी?

वर्तमान उदाहरण (बोल्ड पर जोर मेरा) में:

अन्य कार्यों, इनलाइन और constexpr कार्यों के विपरीत कार्यक्रम में कई बार में परिभाषित किया जा सकता है। आखिरकार, कोड का विस्तार करने के लिए, कंपाइलर को केवल घोषणा की परिभाषा की आवश्यकता नहीं है। हालांकि, किसी दिए गए इनलाइन या कॉन्टेक्सप्रो की सभी परिभाषाओं को बिल्कुल से मेल खाना चाहिए। नतीजतन, इनलाइन और constexpr कार्यों आमतौर पर शीर्षकों में परिभाषित किया जाता है।

मैं इस पर अनुसंधान के एक बिट किया है, और मैं कई जवाब है कि मैं जब तक परिभाषा समान है के रूप में एक इनलाइन समारोह कई बार परिभाषित करने में सक्षम हूँ देखा है। इसके अतिरिक्त, मैंने देखा है कि मानक इसके लिए अनुमति देता है। मैं क्या उत्सुक हूँ: क्यों?

क्या कोई व्यवहार्य कोडिंग स्थिति है जहां मेरे पास एक इनलाइन फ़ंक्शन के लिए दिए गए हेडर फ़ाइल के लिए मेरा # शामिल होगा, केवल मेरी .cpp फ़ाइल में डुप्लिकेट परिभाषा प्रदान करने के लिए? मुझे लगता है कि मुझे एक स्पष्ट स्थिति याद आ रही है जहां यह नियम लागू है। क्यों न केवल इसे बनाएं ताकि आप केवल हेडर फ़ंक्शन को शीर्षलेख, अवधि में परिभाषित कर सकें, और बाद में इसके बारे में चिंता न करें?

सभी बेहतरीन।

+0

एक कार्यान्वयन "अनुवाद इकाइयों" के साथ संचालित होता है, न कि "हेडर फाइल" या "सीपीपी फाइल"। –

+0

सी ++ भाषा में वास्तव में हेडर की धारणा नहीं है। इसमें एक अनुवाद इकाई की धारणा है, जो सभी '# शामिल' प्रीप्रोसेसर निर्देशों को निष्पादित करने के बाद अनिवार्य रूप से एक स्रोत फ़ाइल है। इसलिए, भाषा विनिर्देश सीधे स्रोत फ़ाइल में निर्दिष्ट घोषणा के बीच अंतर नहीं कर सकता है, या किसी अन्य फ़ाइल में # शामिल नहीं किया जा सकता है। आपके पास "हेडर" क्या परिभाषित करने के बिना "सभी इनलाइन फ़ंक्शंस को एक ही शीर्षलेख में परिभाषित किया जाना चाहिए" जैसे नियम नहीं हो सकते हैं, और आमतौर पर यह निर्दिष्ट करते हैं कि C++ प्रोग्राम फ़ाइलों में कैसे व्यवस्थित होता है। –

+0

यह जानना बहुत उपयोगी है। मैं इस धारणा के तहत था कि संकलक के पास प्रीप्रोसेसर के लिए कुछ प्रकार की दृष्टि थी। धन्यवाद! – Joefers

उत्तर

4

उत्तर आश्चर्यजनक रूप से सरल है: यह आपको शीर्षलेख फ़ाइलों के अंदर इनलाइन फ़ंक्शंस के शरीर को परिभाषित करने की अनुमति देने के लिए किया जाता है।

चूंकि हेडर फ़ाइलों को एक अनुवाद इकाई के अंदर "चिपकाया" शब्दशः है, जो उन्हें संदर्भित करता है, हेडर के अंदर कोई फ़ंक्शन परिभाषा उस अनुवाद इकाई के अंदर समाप्त हो जाएगी। यदि आप कई फ़ाइलों से एक ही शीर्षलेख शामिल करते हैं, तो इन सभी फ़ाइलों ने समान परिभाषाओं के साथ समान कार्य परिभाषित किया होगा (क्योंकि वे एक ही शीर्षलेख से आते हैं)।

चूंकि प्रीप्रोकैसिंग चरण संकलन से पहले किया जाता है, इसलिए संकलक को पता नहीं है कि अनुवाद इकाई का कौन सा हिस्सा शीर्षलेख से आया था, और जो आपकी सीपीपी फ़ाइल में था। यही कारण है कि मानक लेखकों के लिए कई समान परिभाषाओं को अनुमति देना आसान था।

+0

इस उत्तर की तरह मुझे वास्तव में अवधारणाओं के चारों ओर अपने सिर लपेटकर चमकती हुई। इसके अतिरिक्त, पूछने से पहले, मैंने सोचा कि कंपाइलर प्रीप्रोसेसर के लिए दृष्टिहीन था। यह अब बहुत अधिक समझ में आता है। मैं एक चिकन-पहले-अंडे के मामले में सोच रहा था। धन्यवाद! – Joefers

1

क्यों न केवल इसे बनाते हैं ताकि आप हेडर, अवधि में केवल एक बार इनलाइन फ़ंक्शन को परिभाषित कर सकें और इसके बारे में चिंता न करें?

जिन कारणों से मैं सोच सकता हूं।

  1. संकलक इसे लागू करने में सक्षम नहीं होगा। सामग्री जो इसे संसाधित करती है पहले ही संसाधित हो चुकी है।

  2. साथ ही, यह भी अनिवार्य है कि इनलाइन फ़ंक्शंस केवल हेडर फ़ाइलों में परिभाषित किया जा सकता है, यह बहुत ही सीमित है। आपको असली दुनिया के अनुप्रयोगों में केवल स्रोत फ़ाइलों में परिभाषित कक्षाओं की एक बड़ी संख्या मिलेगी। यदि शोर inline फ़ंक्शंस का उपयोग नहीं कर पा रहे हैं तो यह शर्म की बात होगी।

+0

"1" वास्तव में एक कारण नहीं है, ऐसे अपरिभाषित व्यवहार के दर्जनों मामले हैं जो कंपाइलर –

+0

@MattMcNabb द्वारा लागू करने योग्य नहीं हैं, मुझे लगता है कि ओपी सोच रहा था कि इसे संकलित समय पर लागू किया जा सकता है या नहीं। –

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