“Повторное определение” ошибки компилятора C++

Извините, наконец, я понял. Я осмотрел свою модель. Вот проблема.

class InsertScript < ApplicationRecord
  enum prev_or_next: {"prev": 1, "next": 2}
  enum activate: {"active": true, "non_active": false}

  default_scope { where("activate = true") }

Это определение перечисления внесло некоторый вред. Когда я устранил это, оно восстановилось.

16
задан inspectorG4dget 11 October 2012 в 09:09
поделиться

8 ответов

Почему делают Вас #include lines.cpp в ThreeD.cpp? Это очень необычно.

Ваш make-файл хочет lines.o, таким образом, Вы собираетесь скомпилировать lines.cpp. Что-либо определенное в lines.cpp будет в lines.o и также в ThreeD.o.

В lines.cpp существует интригующий комментарий:

Don't forget to put declarations in your .h files. 

Я думаю, что преподаватель хочет, чтобы Вы повредили lines.cpp в.h и .cpp.

Выборка от lines.cpp:

/* These go in your .h file or in lines.h */
/*

Line drawing header.

*/


void draw_line(float, float, float, float);
int near_far_clip(float, float, float *, float *, float *, float *,
                  float *, float *);

Я подозреваю, что эти два объявления являются единственной вещью, которая должна быть в lines.h.

14
ответ дан 30 November 2019 в 15:18
поделиться

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

Для Вашей глобальной переменной необходимо использовать extern ключевое слово в Вашем заголовочном файле. Иначе каждый объектный файл экспортирует их собственную переменную, и компоновщик запутывается, относительно которого корректный для использования.

34
ответ дан 30 November 2019 в 15:18
поделиться

Отправьте некоторые фрагменты кода. Возможно, Вы определяете свои методы и в объявлении класса и в снаружи?

class X {
    void foo();    // No definition, just declaration
    void bar() {}  // Declaration + definition
};

void X::foo() {}    // First Definition, OK
void X::bar() {}    // Already defined, ERROR
3
ответ дан 30 November 2019 в 15:18
поделиться

Как был сказан - недостаточно информации для надлежащего диагностирования здесь.

Но если draw_line и др. определяются в заголовочном файле, а не в источнике (cpp) файл, у Вас могут быть методы, которые, предположительно, объявляются как встроенные в заголовочном файле, которые на самом деле правильно не встраивают. В этом случае каждый .cpp файл, который включает заголовок, генерирует их собственное определение draw_line функция, и генерирует предупреждения во время ссылки.

Это может произойти при использовании #defined ВСТРОЕННЫЙ макрос, который прибывает из системного заголовка, о котором забыли или удалили, и по любой причине ВСТРОЕННОЕ не предварительно обрабатывается далеко ни во что.

Например:

//Lines.h

#define GCCC //Note the typo

#if defined(GCC)
#define INLINE inline
#elif defined (MSVC)
#define INLINE __inline
#else

#define INLINE //Due to the typo, INLINE will be turned into nothing
#endif

INLINE void draw_line(float x1, float y1, float x2, float y2)
{
   //Draw the line
}

//File1.cpp
#include "lines.h" //will define draw_line

//File2.cpp
#include "lines.h" //will also define draw_line

И соединение File1.cpp и File2.cpp генерирует ошибки многократного объявления

3
ответ дан 30 November 2019 в 15:18
поделиться

Проверка включает защиту в орфографическую ошибку.
Проверьте Ваш делать опции, возможно, кто-то скомпилировал в несколько объектных файлов.
Попытайтесь исключить части файлов и кода, пока не не найдут причину ошибок.

ОТРЕДАКТИРОВАННЫЙ:
зафиксируйте включают *.cpp файлы. Они, должен быть связан.

3
ответ дан 30 November 2019 в 15:18
поделиться

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

1
ответ дан 30 November 2019 в 15:18
поделиться

Не видя код нет действительно никакой помощи Вам. Компилятор ясно требует противоположности Вас (существует по крайней мере одно дублирующееся определение).

Попытайтесь воспроизвести ошибку с минимальным примером. Вы попытались компилировать код вне Eclipse в командной строке? С какой результат?

1
ответ дан 30 November 2019 в 15:18
поделиться

Привет! Я вижу, что основное правило применяется ко всем. Я объясню, как работают такие ошибки и что они возникают: Возьмем один пример из «Создание глобальной переменной»

Не путайте заголовочный файл с файлом cpp. Заголовок нужен только для того, чтобы несколько файловых проектов могли иметь общий интерфейс перед связыванием.

1. Элемент списка

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

extern int Var_Global;

  1. Элемент списка

    , сохранив при этом Фактический код в
    cpp:
    
    int Var_Global;
    

И убедитесь, что вы 1. включили заголовок и 2. связали код.

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

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

С уважением,

Прашанта

0
ответ дан 30 November 2019 в 15:18
поделиться
Другие вопросы по тегам:

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