Таким образом, моя программа хорошо работает. Компиляция, соединение, выполнение, работы. Затем я решаю добавить простую функцию к одному из моих файлов, как это:
#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, все еще не работает. Я чрезвычайно смущен. Почему был бы, добавляя один простой функциональный винт компоновщик?
Либо объявите функцию встроенной, либо определите ее в отдельном файле .cpp. В противном случае каждый файл C ++, в который вы включаете заголовок, пытается создать собственное общедоступное определение функции.
Edit: и fwiw, вам не нужно явно возвращать true или false, если вы тестируете условное выражение. Просто верните само условие:
inline bool isVowel(const char c)
{
return (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u');
}