Ошибка компилятора GCC: "переопределить... ранее определенные"

Я получаю много "переопределения x... x, ранее определенных здесь". Пожалуйста, что означает эта ошибка?

Ответ 1

Вам нужно ограничить каждый файл включением только один раз. Вы можете сделать это двумя способами.

1) В верхней части ваших файлов заголовков поставьте:

#pragma once

Или 2), если ваш компилятор не поддерживает это, поместите вверх/конец ваших файлов заголовков:

#ifndef _MYFILE_H_
#define _MYFILE_H_
...
#endif

Замените MYFILE именем вашего файла и замените... содержимым файла заголовка.

Ответ 2

Ошибка означает, что есть символ, который был определен в одном месте, и альтернативное определение было сделано в другом месте.

Это может произойти, если в таких случаях, как:

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

В этом последнем случае будет несоответствие между реальной функцией и "неявным объявлением", которое предполагает компилятор, когда у него нет прототипа для использования.

Эти ситуации можно избежать:

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