2012-02-18 11 views
12

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

और बीटीडब्ल्यू जब मैंने इसे मैन्युअल रूप से संकलित करने का प्रयास किया तो मुझे यह त्रुटि मिली कि show() का उपयोग किया गया है लेकिन परिभाषित नहीं किया गया है।

उत्तर

21

यह आवश्यक है कि फ़ंक्शन की परिभाषा ({...} के बीच का हिस्सा) हेडर फ़ाइल में रखा जाए, जब तक कि फ़ंक्शन केवल .cpp फ़ाइल में उपयोग न किया जाए।
विशेष रूप से, यदि आप इनलाइन फ़ंक्शन की परिभाषा को .cpp फ़ाइल में डालते हैं और आप इसे किसी अन्य .cpp फ़ाइल से कॉल करते हैं, तो आपको लिंकर से "unresolved external" त्रुटि मिल जाएगी।

[read more]

4

आम तौर पर संपूर्ण इनलाइन फ़ंक्शंस .h में रहता है कारण यह है कि संकलक को संपूर्ण इनलाइन परिभाषा को सामने देखना होगा। इनलाइन फ़ंक्शंस को उत्सर्जित मशीन भाषा को सीधे 'पेस्टिंग' द्वारा संकलित किया जाता है।

6

हम आम तौर पर हेडर फाइल में इनलाइन समारोह शब्दों में कहें, तो संकलक परिभाषा देख सकते हैं कोड समारोह का उपयोग करता है संयोजित करते समय। इस तरह यह सभी कंपाइलरों के साथ काम करता है।

कुछ कंपाइलरों में एक ही समय में पूरे कार्यक्रम को अनुकूलित करने के लिए विशेषताएं हैं (Whole program optimization या Link time optimization)। ये कंपाइलर एक फ़ंक्शन इनलाइन कर सकते हैं भले ही इसे किसी भिन्न .cpp फ़ाइल में परिभाषित किया गया हो।

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