Ошибка означает, что существует символ, который был определен в одном месте, и альтернативное определение было сделано в другом месте.
Это может произойти, если в таких случаях, как:
- если вы определяете две функции с одинаковым именем
- если есть несоответствие между функцией и ее прототипом
- Вы вызываете нетривиальную функцию до ее определения и без прототипа
В этом последнем случае будет несоответствие между реальной функцией и «неявным объявлением», которое компилятор предполагает, когда у него нет прототипа для использования.
Этих ситуаций можно избежать с помощью:
- Обеспечение того, чтобы прототипы функций объявлялись только один раз
- Обеспечение того, чтобы все функции имели уникальные имена в своей области (т. Е. Внутри файла, если они
static
, или уникальные, если они используются между объектными файлами)
- Будьте осторожны при использовании операторов
extern
в исходных файлах для объявления прототипов. Лучше использовать прототип из соответствующего заголовочного файла.
- Убедитесь, что у всех функций есть прототипы - либо в исходном файле для функций
static
, либо в заголовочном файле, если они будут использоваться другими объектными файлами.
- Убедитесь, что все заголовочные файлы могут быть включены только один раз для каждого исходного файла, используя любую из конструкций, предложенных Мехрдадом и Брайаном Р. Бонди