Подтвердить что ты не робот

Ошибка дубликата символа С++

Я добавил некоторый символ const в свой файл, как описано ниже. Ошибка, которую я получаю, - это дубликат символа _xyz (скажем). В чем проблема с этим и как я могу это избежать.

const char* xyz = "xyz";
class Abc
{
public:
    Abc()
    {
    }
};
4b9b3361

Ответ 1

Если это файл заголовка, вы определяете xyz каждый раз, когда вы #include его.

Вы можете изменить объявление, как показывает @R Samuel Klatchko. Обычный способ (если данные не const) выглядит следующим образом:

В Abc.h:

extern char *xyz;

В Abc.cpp:

char *xyz = "xyz";

Отредактировано для добавления

Обратите внимание, что защита заголовка будет не решить эту проблему:

#ifndef XYZ_H
#define XYZ_H
...
#endif

Защитники заголовка предотвращают ошибки "переопределения", где один и тот же символ отображается дважды в одном модуле компиляции. Это ошибка компилятора.

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

Было бы полезно, если бы оригинальный плакат упомянул об этом, конечно.

Ответ 2

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

Самый простой способ исправить это - дать xyz внутреннюю связь. Вы можете сделать это, сделав сам указатель const, помимо базового char const:

const char* const xyz = "xyz";

Ответ 3

Я тоже столкнулся с этой проблемой, но для меня решение было другим. Я поместил перегруженные операторы (==,! =, <<) в заголовочный файл и реализовал их. Это вызывало проблему в других файлах, где я также использовал ==,! = Или <<. Чтобы решить эту проблему, я переместил реализацию в файл .cpp и оставил объявление в заголовочном файле.

Ответ 4

Пожалуйста, предоставьте содержательное описание проблемы. Какой "мой файл"? Какой "конставный характер" вы принимаете?

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