Ошибка компилятора GCC: «переопределение ... ранее определено» - PullRequest
13 голосов
/ 02 апреля 2009

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

Ответы [ 4 ]

30 голосов
/ 02 апреля 2009

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

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

#pragma once

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

#ifndef _MYFILE_H_
#define _MYFILE_H_
...
#endif

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

10 голосов
/ 02 апреля 2009

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

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

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

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

Этих ситуаций можно избежать с помощью:

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

Возможно, вы включаете заголовочный файл дважды. Убедитесь, что ваши заголовочные файлы окружены #ifndef инструкциями.

http://www.fredosaurus.com/notes-cpp/preprocessor/ifdef.html

0 голосов
/ 10 июня 2018

То же самое произошло со мной, потому что я случайно включил файл .c / .cpp (внутри него) вместо файла заголовка.

Это определенно принесет вам много ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...