Я добавил некоторый символ const в свой файл, как описано ниже. Ошибка, которую я получаю, - это дубликат символа _xyz (скажем). В чем проблема с этим и как я могу это избежать.
const char* xyz = "xyz";
class Abc
{
public:
Abc()
{
}
};
Я добавил некоторый символ const в свой файл, как описано ниже. Ошибка, которую я получаю, - это дубликат символа _xyz (скажем). В чем проблема с этим и как я могу это избежать.
const char* xyz = "xyz";
class Abc
{
public:
Abc()
{
}
};
Если это файл заголовка, вы определяете xyz
каждый раз, когда вы #include
его.
Вы можете изменить объявление, как показывает @R Samuel Klatchko. Обычный способ (если данные не const
) выглядит следующим образом:
В Abc.h:
extern char *xyz;
В Abc.cpp:
char *xyz = "xyz";
Отредактировано для добавления
Обратите внимание, что защита заголовка будет не решить эту проблему:
#ifndef XYZ_H
#define XYZ_H
...
#endif
Защитники заголовка предотвращают ошибки "переопределения", где один и тот же символ отображается дважды в одном модуле компиляции. Это ошибка компилятора.
Но даже с защитой заголовков определение xyz
будет по-прежнему отображаться в каждом исходном файле, который включает его, вызывая ошибку "дублированный символ", которая является ошибкой компоновщика.
Было бы полезно, если бы оригинальный плакат упомянул об этом, конечно.
Проблема заключается в том, что каждый исходный файл, содержащий ваш файл заголовка, получает свою собственную копию xyz
с внешней связью.
Самый простой способ исправить это - дать xyz
внутреннюю связь. Вы можете сделать это, сделав сам указатель const, помимо базового char const:
const char* const xyz = "xyz";
Я тоже столкнулся с этой проблемой, но для меня решение было другим. Я поместил перегруженные операторы (==,! =, <<) в заголовочный файл и реализовал их. Это вызывало проблему в других файлах, где я также использовал ==,! = Или <<. Чтобы решить эту проблему, я переместил реализацию в файл .cpp и оставил объявление в заголовочном файле.
Пожалуйста, предоставьте содержательное описание проблемы. Какой "мой файл"? Какой "конставный характер" вы принимаете?
Для того, что вы предоставили до сих пор, я могу только догадываться, что вы добавили указанное выше определение xyz
в файл заголовка и затем включили его в несколько единиц перевода. Результат: объект xyz
получил более одного раза. Отсюда ошибка.