2010-06-28 8 views
6

Tak więc mój program działa poprawnie. Kompilowanie, łączenie, uruchamianie, prace. Potem zdecydujesz się dodać prostą funkcję do jednego z moich plików, na przykład:błąd wielokrotnej definicji łącza po dodaniu funkcji do wcześniejszego pliku łączącego

#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 

Definicja ta funkcja jest tylko zmiana zrobiłem do mojego kodu. Wszystko inne jest dokładnie takie, jak było. Nic jeszcze tego nie nazywa. Skompilować, a nie odwołuje, z g ++ daje jeden z tych błędów dla każdego pliku, który właczoną to jedno:

./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)': 

Gdybym wykomentuj isVowel, to działa ponownie. Próbowałem zmienić nazwę, nadal nie działa. Próbowałem zastąpienie go tylko void randomFunctionName() {}, nadal nie działa. Próbowałem uczynić go nieinterline i umieszczanie body funkcji w Utility.cpp, nadal nie działa. Jestem bardzo zdezorientowany. Dlaczego dodanie jednej prostej funkcji spowoduje zepsucie linkera?

Odpowiedz

14

Należy zadeklarować funkcję inline lub zdefiniować ją w oddzielnym pliku .cpp. W przeciwnym razie każdy plik C++, w którym znajduje się nagłówek, próbuje utworzyć własną, publicznie dostępną definicję funkcji.

Edytuj: i fwiw, nie musisz jawnie zwracać wartości true lub false, jeśli testujesz warunek. Wystarczy zwrócić się Warunkowo:

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

Jeśli masz na myśli deklarując je jako 'isVowel inline bool (const char c)', próbowałem to i nie ma kości. Próbowałem również umieścić definicję w pliku implementacji i nadal nie działa. – Max

+0

Zakładając, że nie popełniłeś żadnych błędów, gdy próbowałeś tych dwóch rzeczy, to może TYLKO duplikujesz toVowel. Czy dokonałeś globalnego wyszukiwania we wszystkich swoich źródłach? – Cogwheel

+2

Zdrap to. Nie działało to wcześniej, ponieważ po ponownym skompilowaniu makefile nie rekompilował nagłówka. Usunięcie wszystkich plików obiektów i rekompilacja sprawiło, że zauważyło deklarację śródliniową. Dzięki za pomoc. – Max

Powiązane problemy