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एक नाम स्थान पर, इसे और इसे देखें