ошибка компоновщика с несколькими определениями после добавления функции в ранее связанный файл

Так что моя программа работает нормально. Компиляция, компоновка, запуск, работа. Затем я решил добавить простую функцию в один из моих файлов, например:

#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

Это определение функции — единственное изменение, которое я внес в свой код. Все остальное точно так же, как и было. Ничего пока не звонит. Я компилирую, и он не может связать, а g++ выдает одну из этих ошибок для каждого файла, который # включает этот:

./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, но все равно не работает. Я очень смущен. Почему добавление одной простой функции портит компоновщик?


person Max    schedule 28.06.2010    source источник


Ответы (1)


Либо объявите функцию встроенной, либо определите ее в отдельном файле .cpp. В противном случае каждый файл C++, в который вы включаете заголовок, пытается создать собственное общедоступное определение функции.

Изменить: и между прочим, вам не нужно явно возвращать true или false, если вы тестируете условное выражение. Просто верните условное выражение:

inline bool isVowel(const char c)
{
    return (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u');
}
person Cogwheel    schedule 28.06.2010
comment
если вы имеете в виду объявить это как inline bool isVowel(const char c), я пробовал это, и не играл в кости. Я также пытался поместить определение в файл реализации, и все еще не работает. - person Max; 29.06.2010
comment
Предполагая, что вы не сделали ошибок, когда пробовали эти две вещи, возможно, вы ДЕЙСТВИТЕЛЬНО дублируете isVowel. Вы сделали глобальный поиск по всем вашим источникам? - person Cogwheel; 29.06.2010
comment
Сотрите это. Раньше это не работало, потому что, когда я перекомпилировал его, make-файл не перекомпилировал заголовок. Удаление всех объектных файлов и перекомпиляция заставили заметить встроенное объявление. Спасибо за вашу помощь. - person Max; 29.06.2010