2009-09-14 17 views
13

मैं क्यूटी निर्माता में इस चेतावनी को क्यों मिल रहा है?क्यूटी निर्माता: "इनलाइन फ़ंक्शन का उपयोग किया गया लेकिन कभी परिभाषित नहीं किया गया" - क्यों? '() Bool शेर :: ग्राउल' का इस्तेमाल किया `इनलाइन समारोह लेकिन कभी परिभाषित:

मैं अपने कोड की दोबारा जांच कर, और एक घोषणा

Lion (lion.h)

में inline bool growl() और इसी कार्यान्वयन lion.cpp में है:

inline bool Lion::growl()

क्या हो रहा है?

संपादित करें: मेरी धारणा यह है कि .cpp फ़ाइल में वास्तविक इनलाइन विधि को परिभाषित करना कानूनी है (inline कीवर्ड अन्यथा विधि निकाय के लिए कंपाइलर को अलर्ट करता है), या क्या मुझे गलती है?

मैं कार्यान्वयन विवरण के साथ अपने हेडर फाइल को अस्त-व्यस्त करने के लिए नहीं करना चाहती।

+0

ओर ध्यान दें: मैं क्या सीखा है कि इनलाइन कार्यों हेडर फाइल में लागू किया जाता है (या एक अलग लीग फ़ाइल है कि एक शीर्ष लेख के निचले भाग में शामिल में)। – RvdK

उत्तर

26

ठीक है, मैं सटीक समस्या को पता नहीं है, लेकिन शुरुआत के लिए:

  • इनलाइन तरीकों हेडर फाइल में लागू किया जाना चाहिए। कंपाइलर को इनलाइन पर कोड को जानने की आवश्यकता है।
  • इसके अलावा वर्ग घोषणा में "इनलाइन" कीवर्ड का उपयोग कोई असर नहीं होता है। लेकिन यह या तो चोट नहीं पहुंचा सकता है।

यह भी देखें: c++ faq lite

+3

व्यक्तिगत रूप से (और यह स्वाद का विषय है), मैं * नफरत * कोड जो कोड को स्पष्ट रूप से इनलाइन कीवर्ड के साथ चिह्नित करता है - या तो इनलाइन कीवर्ड के साथ, या हेडर फ़ाइल में 2 कारणों से कार्यान्वयन डालकर: 1) यह encapsulation तोड़ता है। 2) यह प्रदर्शन दर्द होता है - हाँ, आपने मुझे सुना है। आपको कौन लगता है कि मैथोड को रेखांकित करने के परिणामस्वरूप प्रदर्शन में सबसे अच्छा प्रदर्शन होगा: संकलक, या प्रोग्रामर। गंभीरता से लोग, अपने अनुकूलकों पर भरोसा करते हैं, वे बेहतर काम करते हैं (कई मामलों में, लेकिन सभी नहीं) तो आप कभी भी करेंगे। – Thomi

+7

@ थॉमी अगर मैं सिर्फ एक फ़ंक्शन के चारों ओर एक 1-लाइन रैपर बना रहा हूं, तो मुझे पूरा यकीन है कि इसके लिए इनलाइन होना बेहतर होगा। –

+0

माइक्रोसॉफ्ट कह रहा है कि वे इस नियम को लागू करके लिंक समय और स्थिर libs में आकार में कमी में बड़ी प्रदर्शन वृद्धि प्राप्त कर सकते हैं: http://blogs.msdn.com/b/vcblog/archive/2014/09/26/feedback- बनाना-zc-inline-default-for-debug-release-configs-in-14.aspx – bames53

1

क्या जोहान कहा के अलावा, आप एक अलग परिभाषा और समारोह भले ही दोनों एक ही हेडर फाइल में हैं के लिए घोषणा नहीं हो सकता। यह विशेष रूप से कक्षाओं के सदस्य कार्यों के लिए सच है। समारोह कोड रूप में होने चाहिए:

class someClass 
{ 
void someFunc() 
{ ... } 
} 
// This will make the function inline even w/o the explicit 'inline' 

और फ़ॉर्म में नहीं

class someClass 
{ 
public: 
    void someFunc(); 
} 

void someClass::someFunc() 
{ ... } 
+0

आप वास्तव में एक अलग परिभाषा और घोषणा कर सकते हैं: 'कक्षा सी {इनलाइन शून्य एफ(); }; शून्य सी :: एफ() {} '। आपको केवल अंतर्निहित के बजाय स्पष्ट 'इनलाइन' का उपयोग करना होगा। – bames53

3

इनलाइन तरीकों हेडर फाइल में लागू किया जाना चाहिए। कंपाइलर को कोड को वास्तव में इनलाइन करने के लिए पता होना चाहिए।

छोड़कर अगर इनलाइन समारोह, एक ही परियोजना में प्रयोग किया जाता है एक और फ़ाइल कि # शामिल अपने शीर्षक में संभवतः

मैं याद आती है पुस्तकालयों के लिए इस तरह के एक प्रतिबंध है हेडर सीमित कार्य करने के लिए क्योंकि प्रोटोटाइप बातें अधिक पठनीय हैं।

# के बारे में- .cpp को शामिल करें?

+0

सी ++ की आवश्यकता है "प्रत्येक अनुवाद इकाई में एक इनलाइन फ़ंक्शन परिभाषित किया जाएगा जिसमें यह ओडीआर-प्रयुक्त होता है।" _n3337 basic.def.odr/3_ इसका अनिवार्य रूप से अर्थ है कि जब एक शीर्षलेख में एक इनलाइन फ़ंक्शन घोषित किया जाता है तो इसे हेडर में भी परिभाषित किया जाना चाहिए। – bames53

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