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

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

#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 ++ предоставление одной из этих ошибок для каждого файла что #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, все еще не работает. Я чрезвычайно смущен. Почему был бы, добавляя один простой функциональный винт компоновщик?

9
задан Max 28 June 2010 в 22:29
поделиться

1 ответ

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

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

inline bool isVowel(const char c)
{
    return (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u');
}
20
ответ дан 4 December 2019 в 10:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: