2011-03-20 3 views
7

निम्नलिखित सरलीकृत example.c फ़ाइल पर cc -std=c99 example.c कर:सी 99 में इनलाइन फ़ंक्शन को सही तरीके से इनलाइन करने और उपयोग करने के लिए कैसे करें? (निर्माण विफल रहता है)

inline void a() 
{ 
} 

int main() 
{ 
    a(); 

    return 0; 
} 

मुझे हो जाता है:
example.c :(पाठ + 0x7):।

समारोह `मुख्य 'में: करने के लिए 'एक'
collect2 अपरिभाषित संदर्भ: ld 1 से बाहर निकलें स्थिति लौटा

मुझे यह समझ के रूप में सी 99 मानक की आवश्यकता के साथ क्या करना है ताकि प्रत्येक इनलाइन गैर स्थैतिक फ़ंक्शन के लिए एक और परिभाषा की मांग की जा सके जो उन मामलों में उपयोग किया जाता है जहां शरीर को रेखांकित नहीं किया जा सकता है? यदि ऐसा है, तो मुझे लगता है कि मैं इसके बजाय static inline के साथ कर सकता हूं, लेकिन मैं नहीं चाहता कि यह मुझे बाद में काट दे, तो यहां कार्रवाई का सबसे अच्छा तरीका क्या होगा? जाहिर है, मैं सी 99 से चिपकना चाहता हूं और मैं कुछ कार्यों को रेखांकित करना चाहता हूं। (हाँ, मुझे पता है कि कंपाइलर आमतौर पर जानता है कि बिना बताए इनलाइन क्या है, लेकिन मेरे पास कारण हैं)

+0

'इनलाइन' कीवर्ड वह नहीं है जो आपको लगता है। यह संकलक के लिए सबसे अच्छा संकेत है कि यह कोड रेखांकित होने के लिए उम्मीदवार हो सकता है। बदतर, यह अनदेखा किया गया है। – jer

+0

क्या आप अन्य फाइलों को अपने सीसी के माध्यम से संकलित कर सकते हैं? शायद कंपाइलर में समस्या। –

+0

असल में मैं '-विनलाइन' का उपयोग कर रहा हूं इसलिए मेरे मामले में इसे अनदेखा नहीं किया जाएगा। मुझे यह निर्दिष्ट करने के लिए क्षमा न करें, लेकिन मुझे नहीं लगता कि कोई इस बात पर टिप्पणी करेगा कि सी में 'इनलाइन' का मतलब क्या है या मामलों के उस तरफ प्रतिक्रिया दे रहा है। उपरोक्त के अधिकांश अन्य बदलावों में, आप बिल्कुल बिल्कुल सही हैं। @ मिहरन नहीं, कंपाइलर के साथ कोई समस्या नहीं है। सी 99 चश्मे के साथ अधिक बारीकी से जांच करने के बाद, मैंने इनलाइन फ़ंक्शन को 'स्थिर इनलाइन' के रूप में निर्दिष्ट किया है और सब कुछ काम करता है। मैं जानना चाहता हूं कि क्या मैं यहां सही कदम उठा रहा हूं ... – amn

उत्तर

0

कोई फ़ंक्शन प्रोटोटाइप नहीं है, यह सब कुछ है, इसलिए फ़ंक्शन हस्ताक्षर अनुमानित है, और अनुमानित गलत है। "शून्य एक();" जोड़ें फ़ाइल के शीर्ष पर, और आप सब तैयार हैं।

+0

हां, यह काम करता है अगर 'ए' को एक ही एकल अनुवाद इकाई में परिभाषित किया गया है (जो कि मैंने जो उदाहरण दिया है)। जैसे ही मैं इस इनलाइन फ़ंक्शन को 'साझा' करने का प्रयास करता हूं, हालांकि अपनी परिभाषा को अपने शीर्षलेख में डालकर और इस शीर्षलेख को दो या दो से अधिक अनुवाद इकाइयों से जोड़कर, यह काम नहीं करता है और मुझे इसके बजाय 'त्रुटि' की 'एकाधिक परिभाषा' मिलती है। । क्या देता है? – amn

6

शायद आप उस त्रुटि में नहीं होंगे जब आप -O2 या तो संकलित करते हैं।

इनलाइन समारोह परिभाषाओं हेडर फाइल में जाना चाहिए और एक extern inlineघोषणाएक संकलन इकाई में जाना चाहिए।

inline void a(void){ 
// empty 
} 

// in just one .c file 
#include "the-file.h" 
extern inline void a(void); 

Btw, घोषित करने void बिना a एक प्रोटोटाइप नहीं है मत करो।

+0

ठीक है, यह दिलचस्प है। अगर मुझे कई अनुवाद इकाइयों द्वारा उपयोग करने के लिए 'ए' की परिभाषा की आवश्यकता है तो मैं कैसे आगे बढ़ूंगा? – amn

+0

@amn, एक शीर्षलेख फ़ाइल में 'इनलाइन' * परिभाषा * और अनुवाद इकाइयों में से एक में' बाहरी इनलाइन 'घोषणा डालें। सावधान रहें कि इसके लिए आपको वास्तव में एक सी 99 अनुपालन संकलक की आवश्यकता है। नया जीसीसी उदाहरण होगा। –

+0

@JensGustedt मैं यह कहता रहूंगा जब भी मुझे ऐसा कोई दावा हो जो दावा करता है, लेकिन स्रोत फ़ाइल में भी परिभाषा होनी चाहिए। – YoYoYonnY

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