2012-10-11 34 views
23

क्या कोई मुझे बता सकता है कि इनलाइन फ़ंक्शन और स्थिर इनलाइन फ़ंक्शन के बीच क्या अंतर है?इनलाइन फ़ंक्शन और स्थिर इनलाइन फ़ंक्शन के बीच अंतर

किस मामले में मुझे इनलाइन पर स्थिर इनलाइन पसंद करनी चाहिए?

मैं इस सवाल से पूछ रहा हूं क्योंकि मेरे पास एक इनलाइन फ़ंक्शन है जिसके लिए मुझे लिंकिंग के दौरान संकलन के मुद्दों का सामना करना पड़ रहा है (relocation error:... symbol has been discarded with discarded section ...)। मैंने इसे एक सामान्य कार्य किया और यह काम किया। अब मेरे कुछ वरिष्ठ नागरिकों ने मुझे स्थिर इनलाइन के साथ प्रयास करने के लिए कहा।

inline void wizSendNotifier (const char* nn_name, bpDU* arg=0, int aspect = -1) 
{ 
    wizuiNotifier* notifier = ::wizNtrKit.getNotifier (nn_name); 
    notifier->notify (arg, aspect); 
} 

और एक वर्ग के अंदर इस नहीं: नीचे मेरी कार्य है। यह एक हेडर फ़ाइल के अंदर है!

मुझे लगता है कि एक स्थिर कार्य को कॉल केवल विशेष टीयू में किया जाना चाहिए जहां इसे परिभाषित किया गया है।

चूंकि मेरा फ़ंक्शन हेडर फ़ाइल में है और यदि मैं इसे स्थिर बना देता हूं, तो क्या यह मामला होगा कि जहां भी मैं हेडर फ़ाइल को शामिल करता हूं, उस स्थिर इकाई का उपयोग उस अनुवाद इकाई में किया जा सकता है?

+0

क्या यह कार्य कक्षा के अंदर है? कृपया इसकी घोषणा भी पोस्ट करें। – anatolyg

+1

एक स्थिर वस्तु ':: wizNtrKit' है? इसका संबंध क्या है? – Walter

+0

इसके अलावा, समारोह कहां दिखाई देता है? शीर्षलेख फ़ाइल, स्रोत फ़ाइल? कितनी स्रोत फाइलें इसे शामिल करती हैं? –

उत्तर

36

गैर स्थैतिक inline फ़ंक्शन घोषणा प्रत्येक अनुवाद इकाई (स्रोत फ़ाइल) में उसी फ़ंक्शन को संदर्भित करती है जो इसका उपयोग करती है।

एक परिभाषा नियम के लिए आवश्यक है कि फ़ंक्शन परिभाषा का शरीर "समान" की लंबी परिभाषा के साथ प्रत्येक टीयू में समान है। यह आम तौर पर संतुष्ट होता है कि स्रोत फाइलें सभी एक ही शीर्षलेख का उपयोग करती हैं, और बशर्ते कि फ़ंक्शन आंतरिक लिंकेज (static फ़ंक्शंस सहित) या किसी भी मैक्रोज़ को अलग-अलग टीयू में अलग-अलग परिभाषित किए गए किसी भी वैश्विक नाम का उपयोग न करे।

मुझे याद नहीं है कि उस विशेष लिंकर त्रुटि से पहले सामना करना पड़ेगा, लेकिन कम से कम यह संभव है कि इनमें से एक प्रतिबंध जिम्मेदार है। आवश्यकताओं को पूरा करने की आपकी ज़िम्मेदारी है: यदि आप नहीं करते हैं तो बिना किसी डायग्नोस्टिक के अनिर्धारित व्यवहार की आवश्यकता होती है।

static inline फ़ंक्शन घोषणा प्रत्येक अनुवाद इकाई में एक अलग फ़ंक्शन को संदर्भित करती है, जो कि समान नाम होने के लिए होती है। यह static वैश्विक नाम या मैक्रोज़ का उपयोग कर सकता है जो विभिन्न टीयू में अलग हैं, इस मामले में फ़ंक्शन अलग-अलग टीयू में अलग-अलग व्यवहार कर सकता है, भले ही हेडर फ़ाइल में इसकी परिभाषा "समान दिखती है"।

इस अंतर के कारण, यदि फ़ंक्शन में static स्थानीय चर शामिल हैं तो यह अलग-अलग व्यवहार करता है कि यह static है या नहीं। यदि यह static है तो प्रत्येक टीयू के पास फ़ंक्शन का अपना संस्करण होता है और इसलिए static स्थानीय चर की अपनी प्रतिलिपि होती है। यदि यह केवल inline है, तो सभी टीयू द्वारा उपयोग किए गए static स्थानीय चर की केवल एक प्रति है।

+2

नोट: 'स्थिर 'फ़ंक्शंस के मामले में,' इनलाइन' बिट इसके अर्थपूर्ण अर्थ को खो देता है (* यह ठीक है अगर वह फ़ंक्शन परिभाषा एकाधिक टीयू * में दिखाई देता है;); 'इनलाइन' से जुड़ी एकमात्र चीज कंपाइलर के लिए एक संकेत है, जो लगभग अनदेखा करती है। –

+0

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

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