Название: Проблема multiple definition Отправлено: alik от Январь 01, 2016, 14:28 Всем доюбрый день и доброго нового года!
Я пришел из Delphi среды, многое нравится, но никак не разберусь с проблемой multiple definition. Вот пример проекта, при котором вываливается ошибка "multiple definition of 'n'" 1) Header "constants.h" #ifndef CONSTANTS_H #define CONSTANTS_H #include "math.h" extern const double Pi180 = M_PI/180; extern const double _180Pi = 180/M_PI; extern const double Div_36000 = 1/36000; char n[] = {13, 10, 0}; //char n[] = {13, 13, 10, 0}; extern const QString Enter(n); #endif // CONSTANTS_H 2) mainwindow.h #include "mainwindow.h" #include "ui_mainwindow.h" ... #include "constants.h" ..... 3) map.cpp #include "map.h" #include "ui_map.h" #include "map_interface.h" #include "constants.h" ... Когда компилирую проект выпадает указанная выше ошибка multiple definition на каждую из объявленных в constants.h переменных. Если убираю инструкцию extern, возникает такая же самая ошибка. (( Название: Re: Проблема multiple definition Отправлено: torwig от Январь 01, 2016, 15:06 Ключевое слово extern убирайте. Как один из вариантов, добавьте ключевое слово static для каждой константы.
Еще посмотрите, чтобы файл был один раз упомянут в списке .pro-файла. Очистите, пересоберите проект. Название: Re: Проблема multiple definition Отправлено: kambala от Январь 01, 2016, 19:51 в .h пихай только объявления, например extern const double Pi180;
в соответствующий .cpp пихай определения, например const double Pi180 = M_PI/180; Название: Re: Проблема multiple definition Отправлено: alik от Январь 01, 2016, 20:05 Ключевое слово extern убирайте. Как один из вариантов, добавьте ключевое слово static для каждой константы. /Проблема сохраниласьЕще посмотрите, чтобы файл был один раз упомянут в списке .pro-файла. Очистите, пересоберите проект. Название: Re: Проблема multiple definition Отправлено: alik от Январь 01, 2016, 20:10 в .h пихай только объявления, например extern const double Pi180; А вот этот вариант решил проблему! Спасибо.в соответствующий .cpp пихай определения, например const double Pi180 = M_PI/180; Это был простой случай объявлений. Попробую подключить другие модули. Сейчас мне пока сложно понять принцип подключения тех или иных модулей (хедеров): 1) Могу ли я подключать какой-либо хедер многократно (в разных cpp-файлах) внутри одного большого проекта? 2) Можно ли делать у двух хедеров ссылки #include друг на друга ? Или лучше, если надо кусок оттуда и кусок оттуда сделать третий хедер и сpp и там описать общие классы и типы ? Название: Re: Проблема multiple definition Отправлено: alik от Январь 01, 2016, 20:43 в .h пихай только объявления, например extern const double Pi180; Возникла другая проблема - когда я в другом хедере, сославшись на хедер constants.h объявляю массив, напримерв соответствующий .cpp пихай определения, например const double Pi180 = M_PI/180; interfaces.h #include "constants.h" typedef bool TRepersScanAngles[MAX_COUNT_REPER_ANGLE]; где константа MAX_COUNT_REPER_ANGLE была объявлена в constants.h как: extern const int MAX_COUNT_REPER_ANGLE; а в constants.cpp как: const int MAX_COUNT_REPER_ANGLE = 3; то выдается ошибка "array bound is not an integer constant before ']' token" Название: Re: Проблема multiple definition Отправлено: kambala от Январь 04, 2016, 14:01 1) Могу ли я подключать какой-либо хедер многократно (в разных cpp-файлах) внутри одного большого проекта? 1) да2) Можно ли делать у двух хедеров ссылки #include друг на друга ? Или лучше, если надо кусок оттуда и кусок оттуда сделать третий хедер и сpp и там описать общие классы и типы ? 2) вообще можно, но нежелательно — означает кривую архитектуру. лучше выделять в отдельный файл общие части, да. в .h пихай только объявления, например extern const double Pi180; Возникла другая проблема - когда я в другом хедере, сославшись на хедер constants.h объявляю массив, напримерв соответствующий .cpp пихай определения, например const double Pi180 = M_PI/180; interfaces.h #include "constants.h" typedef bool TRepersScanAngles[MAX_COUNT_REPER_ANGLE]; где константа MAX_COUNT_REPER_ANGLE была объявлена в constants.h как: extern const int MAX_COUNT_REPER_ANGLE; а в constants.cpp как: const int MAX_COUNT_REPER_ANGLE = 3; то выдается ошибка "array bound is not an integer constant before ']' token" |