2016-09-23 13 views
5

मैं ओडीआर पढ़ रहा था और के रूप में शासन "In the entire program, an object or non-inline function cannot have more than one definition" कहते हैं और मैंने कोशिश की निम्न में से एकाधिक परिभाषा ...एक परिभाषा नियम - इनलाइन कार्यों

file1.cpp

#include <iostream> 
using namespace std; 

inline int func1(void){ return 5; } 
inline int func2(void){ return 6; } 
inline int func3(void){ return 7; } 
int sum(void); 

int main(int argc, char *argv[]) 
{ 
    cout << func1() << endl; 
    cout << func2() << endl; 
    cout << func3() << endl; 
    cout << sum() << endl; 
    return 0; 
} 

file2.cpp

inline int func1(void) { return 5; } 
inline int func2(void) { return 6; } 
inline int func3(void) { return 7; } 
int sum(void) { return func1() + func2() + func3(); } 

यह नियम के अनुसार काम करता है। मैं इनलाइन कार्यों की कई परिभाषा रख सकता हूं।

  • गैर-इनलाइन फ़ंक्शन लिंकेज और इनलाइन फ़ंक्शन लिंकेज के बीच क्या अंतर है?
  • लिंकर इन दोनों के बीच अंतर कैसे करता है?
+0

उन्होंने उद्धृत किया कि एक वस्तु या * गैर-इनलाइन * फ़ंक्शन में एक से अधिक परिभाषा नहीं हो सकती है। –

उत्तर

7

एक समारोह inline बनाना दो बातें करता है (दूसरी बात अपने प्रश्न से अधिक प्रासंगिक है):

  1. यह संकलक करने के लिए प्रोग्रामर द्वारा एक सुझाव है, इस समारोह तेजी से करने के लिए कॉल करने के लिए है , संभवतः इनलाइन विस्तार करके। असल में, इनलाइन विस्तार एक मैक्रो जैसे इनलाइन फ़ंक्शन का इलाज करने के समान होता है, जो उसके शरीर के कोड द्वारा प्रत्येक कॉल का विस्तार करता है। यह सुझाव है - संकलक ऐसा नहीं कर सकता (और कभी-कभी नहीं) विभिन्न अनुकूलन निष्पादित नहीं कर सकता है।

  2. यह फ़ंक्शन का दायरा एक अनुवाद इकाई के रूप में निर्दिष्ट करता है। इसलिए, inline फ़ंक्शन foo.cpp में दिखाई देता है (या तो क्योंकि इसमें लिखा गया था, या क्योंकि यह #include एक हेडर जिसमें लिखा गया था, उस स्थिति में प्रीप्रोसेसर मूल रूप से ऐसा करता है)। अब आप foo.cpp संकलित करें, और संभवतः कुछ अन्य bar.cpp जिसमें एक ही हस्ताक्षर के साथ inline फ़ंक्शन भी शामिल है (संभवतया सटीक वही है; संभवतः #include दोनों ही शीर्षलेख में)। जब लिंकर दो ऑब्जेक्ट फ़ाइलों को लिंक करता है, तो इसे ओडीआर का उल्लंघन नहीं माना जाएगा, क्योंकि inline निर्देश फ़ाइल की प्रत्येक प्रति को अपनी अनुवाद इकाई (ऑब्जेक्ट फ़ाइल को प्रभावी रूप से संकलित करके बनाया गया) में बनाया गया है। यह कोई सुझाव नहीं है, यह बाध्यकारी है।

यह संयोग नहीं है कि ये दोनों चीजें एक साथ जाती हैं। सबसे आम मामला inline फ़ंक्शन के लिए कई स्रोत फ़ाइलों द्वारा शीर्षलेख #include डी में दिखाई देने के लिए है, संभवतः प्रोग्रामर तेज़ इनलाइन विस्तार का अनुरोध करना चाहता था। इसके लिए अनुवाद-इकाई इलाके नियम की आवश्यकता है, हालांकि, लिंकर त्रुटियां उत्पन्न नहीं होनी चाहिए।

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