2010-06-28 17 views
6

पर फ़ंक्शन जोड़ने के बाद एकाधिक परिभाषा लिंकर त्रुटि तो मेरा प्रोग्राम ठीक काम कर रहा है। संकलन, लिंकिंग, चल रहा है, काम करता है। फिर, मैं इस तरह मेरी फ़ाइलों में से एक के लिए एक सरल समारोह को जोड़ने के लिए, तय:एक पूर्व लिंकिंग फ़ाइल

#ifndef UTILITY_HPP 
#define UTILITY_HPP 

/* #includes here. There's no circular include, I've checked. */ 

namespace yarl 
{ 
    namespace utility 
    { 
     (several function declarations and definitions) 

     bool isVowel(const char c) 
     { 
      if(c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') 
       return true; 
      else return false; 
     } 
    } 
} 

#endif 

कि समारोह परिभाषा केवल परिवर्तन मैं अपने कोड में किए गए है। बाकी सब कुछ वैसा ही है जैसा वह था। अभी तक कुछ भी नहीं कहता है। मैं संकलन, और यह ++ लिंक करने के लिए विफल रहता है, जी के साथ हर फ़ाइल है कि यह एक #includes के लिए इन त्रुटियों में से एक दे रही है:

./obj/Feature.o: In function `yarl::utility::isVowel(char)': 
/home/max/Desktop/Development/Yarl Backup/yarl v0.27/src/Utility.hpp:130: multiple  definition of `yarl::utility::isVowel(char)' 
./obj/Events.o:/home/max/Desktop/Development/Yarl Backup/yarl v0.27/src /Utility.hpp:130: first defined here 
./obj/GameData.o: In function `yarl::utility::isVowel(char)': 

अगर मैं isVowel बाहर टिप्पणी, यह फिर से काम करता है। मैंने इसे नाम बदलने की कोशिश की है, अभी भी काम नहीं करता है। मैंने इसे void randomFunctionName() {} के साथ बदलने की कोशिश की है, अभी भी काम नहीं करता है। मैंने इसे गैर-इनलाइन बनाने और Utility.cpp में फ़ंक्शन बॉडी डालने का प्रयास किया है, फिर भी काम नहीं करता है। मैं बेहद उलझन में हूँ। एक साधारण फ़ंक्शन जोड़ने से लिंकर क्यों खराब हो जाएगा?

उत्तर

14

या तो फ़ंक्शन इनलाइन घोषित करें, या इसे एक अलग .cpp फ़ाइल में परिभाषित करें। अन्यथा प्रत्येक सी ++ फ़ाइल जिसमें आप हेडर शामिल करते हैं, फ़ंक्शन की अपनी सार्वजनिक, सार्वजनिक रूप से उपलब्ध परिभाषा बनाने की कोशिश कर रहा है।

संपादित करें: और fwiw, यदि आप सशर्त परीक्षण कर रहे हैं तो आपको स्पष्ट रूप से सही या गलत वापस करने की आवश्यकता नहीं है। बस सशर्त ही लौट:

inline bool isVowel(const char c) 
{ 
    return (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u'); 
} 
+0

अगर आप 'के रूप में इनलाइन bool isVowel (स्थिरांक चार ग)' यह घोषित मतलब है, मैं करने की कोशिश की है कि, और कोई पासा। मैंने कार्यान्वयन फ़ाइल में परिभाषा डालने का भी प्रयास किया है, और अभी भी काम नहीं करता है। – Max

+0

मान लीजिए कि आपने उन दो चीजों की कोशिश करते समय कोई गलती नहीं की है, तो हो सकता है कि आप डुप्लिकेट कर रहे हों। क्या आपने अपने सभी स्रोतों के माध्यम से वैश्विक खोज की है? – Cogwheel

+2

स्क्रैच करें कि। यह पहले काम नहीं करता था क्योंकि जब मैंने इसे पुन: संकलित किया तो मेकफ़ाइल ने हेडर को दोबारा नहीं बनाया। सभी ऑब्जेक्ट फ़ाइलों को हटाने और पुन: संकलित करने से इनलाइन घोषणा को नोटिस किया गया। आपकी सहायता के लिए धन्यवाद. – Max

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