C ++ इनलाइन, C इनलाइन से बिलकुल अलग है।
#include <iostream>
extern inline int i[];
int i [5];
struct c {
int function (){return 1;} //implicitly inline
static inline int j = 3; //explicitly inline
};
int main() {
c j;
std::cout << i;
}
inline
अपने आप ही संकलक, कोडांतरक और लिंकर को प्रभावित करता है। यह संकलक के लिए एक निर्देश है जिसमें कहा गया है कि केवल इस फ़ंक्शन / डेटा के लिए एक प्रतीक का उपयोग करें यदि यह अनुवाद इकाई में उपयोग किया जाता है, और यदि यह है, तो कक्षा विधियों की तरह, कोड में उन्हें स्टोर करने के लिए कोडांतरक को बताएं.section .text.c::function(),"axG",@progbits,c::function(),comdat
या.section .bss.i,"awG",@nobits,i,comdat
डेटा के ।
यह इस प्रकार है .section name, "flags"MG, @type, entsize, GroupName[, linkage]
। उदाहरण के लिए, अनुभाग नाम है .text.c::function()
। axG
इसका मतलब यह है कि यह खंड आवंटन योग्य है, निष्पादन योग्य है और एक समूह में एक समूह का नाम निर्दिष्ट किया जाएगा (और कोई एम झंडा नहीं है, इसलिए कोई entsize निर्दिष्ट नहीं किया जाएगा); @progbits
इसका मतलब है कि अनुभाग में डेटा है और रिक्त नहीं है; c::function()
समूह का नाम और समूह हैcomdat
लिंकेज का अर्थ है कि सभी ऑब्जेक्ट फ़ाइलों में, इस समूह के नाम के साथ काम करने वाले सभी वर्गों को कॉमडेट के साथ टैग किया गया, अंतिम निष्पादन योग्य से हटा दिया जाएगा 1 को छोड़कर। संकलक यह सुनिश्चित करता है कि अनुवाद इकाई में केवल एक ही परिभाषा है और फिर कोड डालने के लिए कोडांतरक से कहता है यह ऑब्जेक्ट फ़ाइल में अपने समूह में (1 समूह में 1 खंड) और फिर लिंकर यह सुनिश्चित करेगा कि यदि किसी भी ऑब्जेक्ट फ़ाइलों में समान नाम वाला कोई समूह है, तो केवल अंतिम में एक को शामिल करें। exe। के बीच का अंतर inline
और उपयोग नहींinline
अब कोडांतरक को दिखाई दे रहा है और परिणामस्वरूप लिंकर, क्योंकि यह नियमित में संग्रहीत नहीं है .data
या.text
उनके निर्देशन के कारण कोडांतरक द्वारा आदि ।
static inline
एक कक्षा में इसका मतलब है कि यह एक प्रकार की परिभाषा है और घोषणा नहीं है (स्थिर सदस्य को कक्षा में परिभाषित करने की अनुमति देता है) और इसे इनलाइन बनाता है; यह अब ऊपर जैसा व्यवहार करता है।
static inline
फ़ाइल स्कोप पर केवल कंपाइलर को प्रभावित करता है। यह संकलक के लिए इसका अर्थ है: केवल इस फ़ंक्शन / डेटा के लिए एक प्रतीक का उत्सर्जन करें यदि इसका अनुवाद इकाई में उपयोग किया जाता है और ऐसा एक नियमित स्थैतिक प्रतीक (स्टोर in.text /.data बिना .globl निर्देश के) के रूप में करें। कोडांतरक के बीच अब कोई अंतर नहीं है static
औरstatic inline
extern inline
एक घोषणा है जिसका अर्थ है कि आपको अनुवाद इकाई में इस प्रतीक को परिभाषित करना चाहिए या संकलक त्रुटि फेंकना चाहिए; अगर यह तो परिभाषित किया है एक नियमित रूप से मानते हैं inline
और कोडांतरक और संयोजक के लिए वहाँ के बीच कोई अंतर हो जाएगा extern inline
और inline
है, तो यह केवल एक संकलक गार्ड है।
extern inline int i[];
extern int i[]; //allowed repetition of declaration with incomplete type, inherits inline property
extern int i[5]; //declaration now has complete type
extern int i[5]; //allowed redeclaration if it is the same complete type or has not yet been completed
extern int i[6]; //error, redeclaration with different complete type
int i[5]; //definition, must have complete type and same complete type as the declaration if there is a declaration with a complete type
त्रुटि पंक्ति के बिना ऊपर का पूरा हिस्सा ढह जाता है inline int i[5]
। जाहिर है अगर आपने कियाextern inline int i[] = {5};
उसके बादextern
असाइनमेंट के माध्यम से स्पष्ट परिभाषा के कारण नजरअंदाज कर दिया जाएगा।
inline
एक नाम स्थान पर, इसे और इसे देखें