2011-12-22 26 views
6

यदि मैं कोई फ़ंक्शन इनलाइन करता हूं तो क्या यह इसके लिंक को आंतरिक लिंकेज में बदल देता है? उदाहरण के लिए: मैं उपयोग कर रहा हूँ या दो फाइलों में इनलाइन फ़ंक्शन कॉल:क्या फ़ंक्शन इनलाइन बनाना इसके संबंध को प्रभावित करता है?

file1.cpp 

//function definition 
inline void foo() {} 

file2.cpp 
//function definition 
inline void foo() {} 

क्यों यह कॉल करने के लिए सक्षम होने के लिए मैं हर फाइल में इनलाइन समारोह को परिभाषित करने की जरूरत है? मुझे एक आंतरिक संबंध मिल रहा है? अगर मैं static inline का उपयोग करता हूं तो क्या होगा?

+0

जबकि मुझे पता है कि टैग सी ++ है, यह जानना अच्छा है कि सी में इनलाइनें डिफ़ॉल्ट आंतरिक लिंकेज हैं, सी ++ –

+0

@ जेसे के विपरीत: नहीं, इसके विपरीत नहीं। इनलाइन फ़ंक्शन सी (सी 99) में डिफ़ॉल्ट रूप से बाहरी लिंक भी डिफ़ॉल्ट घोषित नहीं किया जाता है। – user1086635

+0

@ user1086635: नहीं, सी में डिफ़ॉल्ट रूप से आंतरिक संबंध है। सी 99 6.7.4/6 कहता है "एक इनलाइन परिभाषा फ़ंक्शन के लिए बाहरी परिभाषा प्रदान नहीं करती है, और किसी अन्य अनुवाद इकाई में बाहरी परिभाषा को रोक नहीं देती है।", एक अतिरिक्त 'बाहरी' घोषणा के साथ बाहरी परिभाषा बनाने का उदाहरण देना । –

उत्तर

10

यदि मैं कोई फ़ंक्शन इनलाइन करता हूं तो क्या यह आंतरिक संबंध में इसके संबंध को बदलता है?

नहीं, इसे इनलाइन बनाने से इसकी जुड़ाव नहीं बदली है।

मुझे कॉल करने में सक्षम होने के लिए प्रत्येक फ़ाइल में इनलाइन फ़ंक्शन को परिभाषित करने की आवश्यकता क्यों है?

क्योंकि भाषा की आवश्यकता है। सी ++ 11 7.1.2/4 कहता है "प्रत्येक अनुवाद इकाई में एक इनलाइन फ़ंक्शन परिभाषित किया जाएगा जिसमें यह ओडीआर-प्रयुक्त होता है और प्रत्येक मामले में एक ही परिभाषा के ठीक होगा।"

मुझे आंतरिक संपर्क मिल रहा है?

नहीं, यह अभी भी बाहरी संबंध है: फ़ंक्शन के लिए एक सूचक के पास किसी भी अनुवाद इकाई में समान मूल्य होगा, और फ़ंक्शन के अंदर घोषित कोई भी स्थिर वस्तु किसी भी अनुवाद इकाई में एक ही वस्तु होगी।

यदि मैं static inline का उपयोग करता हूं तो क्या होगा?

static के कारण आंतरिक लिंकेज देगा। इसका मतलब है कि अलग-अलग अनुवाद इकाइयों में परिभाषा अलग-अलग पतों और किसी भी स्थिर वस्तुओं की विशिष्ट प्रतियों के साथ अलग-अलग कार्यों का उत्पादन करेगी।

+0

ठीक है, अगर मेरे पास इन दो फाइलों में प्रत्येक इनलाइन फ़ंक्शन को 'स्थिर' घोषित किया गया था, तो यह मेरे प्रोग्राम को कैसे प्रभावित करेगा? क्योंकि यहां तक ​​कि यदि कार्यों में बाह्य संबंध हैं, तो उनकी परिभाषाओं को अभी भी प्रत्येक फ़ाइल में प्रस्तुत करने की आवश्यकता है। – user1086635

+1

@ user1086635: यदि आप उन्हें 'स्थिर' घोषित करते हैं, तो प्रत्येक एक अलग कार्य होगा; उदाहरण के लिए, उनके पते अलग होंगे, और प्रत्येक के पास किसी भी स्थिर डेटा की अपनी प्रति होगी। बाहरी संबंध के साथ, उनके पास एक ही पता होगा और स्थिर डेटा साझा करेगा। –

+0

इनलाइन के पॉइंटर्स के बारे में नोट निर्दिष्ट नहीं है। इनलाइन फ़ंक्शन की कई प्रतियां मौजूद हो सकती हैं - क्योंकि प्रत्येक अनुवाद इकाई को एक प्रति प्राप्त होती है। तब यह अपरिभाषित किया जाता है कि _linker_ कैसे हल करता है।यदि आप ओडीआर नियम का उल्लंघन करते हैं तो आप अजीब परिणाम प्राप्त कर सकते हैं जैसे विभिन्न कार्यों को बुलाया जा रहा है। इस प्रकार आप मान सकते हैं कि पॉइंटर्स वही होंगे, भले ही आप ओडीआर का पालन करें। –

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