2013-02-21 36 views
6

मुझे कुछ कंपाइलर/लिंकर त्रुटियां मिलीं और मुझे नहीं पता कि आगे बढ़ने के लिए सही तरीका क्या है। मैं इस स्थिति में हूं:लिंकर त्रुटि इनलाइन फ़ंक्शन

  • a.h: इस फ़ाइल में "इनलाइन" के रूप में घोषित एक फ़ंक्शन को परिभाषित किया गया है, उदाहरण के लिए: इनलाइन शून्य foo1();
  • b.h: इस फ़ाइल में "इनलाइन" के रूप में घोषित एक फ़ंक्शन को परिभाषित किया गया है जो foo1(): इनलाइन शून्य foo2() को कॉल करता है;
  • main.c: foo1 और foo2() दोनों के कुछ फ़ंक्शन कॉल हैं।

अब, अगर मैं आह में foo1 और foo2 घोषित करने और bh मैं निम्नलिखित त्रुटि मिली निर्वासन इनलाइन शून्य के रूप में:

prj/src/b.o: In function foo1': (.text+0x0): multiple definition of foo1' prj/src/main.o:(.text+0x0): first defined here make: * [kernel] Error 1

क्या जिस तरह संकलित करने के लिए और में बिना त्रुटियों/चेतावनी लिंक अनुमति देते हैं स्थिति मैंने वर्णित किया?

+2

'स्थिर इनलाइन' का उपयोग करने के बारे में क्या? – FatalError

+0

मुझे लगता है कि यह काम नहीं करेगा। स्थिर विशेषता का अर्थ यह है कि यह केवल अनुवाद इकाई में दिखाई देता है जहां घोषित/परिभाषित किया गया है और मैं अन्य मॉड्यूल में उन कार्यों का उपयोग करना चाहता हूं ... – r0x

+0

नहीं, प्रतीक्षा करें। स्थिर के साथ यह काम करता है ... लेकिन क्यों? @ 75inchpianist – r0x

उत्तर

13

http://gcc.gnu.org/onlinedocs/gcc/Inline.html से:

When an inline function is not static, then the compiler must assume that there may be calls from other source files; since a global symbol can be defined only once in any program, the function must not be defined in the other source files, so the calls therein cannot be integrated. Therefore, a non-static inline function is always compiled on its own in the usual fashion.

दूसरे शब्दों में, static बिना, यह आपके इनलाइन समारोह के लिए एक प्रतीक का उत्सर्जन करता है। यदि आप को परिभाषित करते हैं जो शीर्षलेख में कार्य करता है और इसे एक से अधिक संकलन इकाई में शामिल करता है, तो आप एकाधिक (परिभाषित) प्रतीकों के साथ समाप्त होते हैं। यदि आप हेडर में परिभाषा को शामिल करना चाहते हैं, तो आपको इसे static बनाना चाहिए।

0

inline अपनी .h फ़ाइल में परिभाषाएं रखें और .c फ़ाइलों में बाहरी परिभाषा को बल दें।

उदाहरण के लिए:

// File: a.h 
inline void foo1(void) { /*...*/ } 

// File main.c 
#include "a.h" 

extern inline void foo1(void); 

int main(void) 
{ 
    /*...*/ 
} 
+0

स्थिर इनलाइन (हेडर फाइलों में) के साथ यह काम करता है ... लेकिन मुझे समझ में नहीं आया क्यों। क्या आप मुझे समझा सकते हैं कि यह क्यों काम करता है? – r0x

+0

यह कोड 'स्थिर इनलाइन' केवल 'इनलाइन'' का उपयोग नहीं करता है। – ouah

0

मैं इसे करने की कोशिश की और किसी भी त्रुटि

a.h नहीं मिला

extern inline void foo1() 
{ 
    return; 
} 

b.h

extern inline void foo2() 
{ 
    foo1(); 
    return; 
} 

main.cpp

#include "a.h" 
#include "b.h" 

int main() { 
    foo1(); 
    foo2(); 
    return 0; 
} 
संबंधित मुद्दे