Russian Qt Forum
Май 17, 2024, 01:59 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема multiple definition  (Прочитано 4966 раз)
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, возникает такая же самая ошибка. ((

Записан
torwig
Самовар
**
Offline Offline

Сообщений: 134



Просмотр профиля
« Ответ #1 : Январь 01, 2016, 15:06 »

Ключевое слово extern убирайте. Как один из вариантов, добавьте ключевое слово static для каждой константы.
Еще посмотрите, чтобы файл был один раз упомянут в списке .pro-файла.
Очистите, пересоберите проект.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4729



Просмотр профиля WWW
« Ответ #2 : Январь 01, 2016, 19:51 »

в .h пихай только объявления, например extern const double Pi180;

в соответствующий .cpp пихай определения, например const double Pi180 = M_PI/180;
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
alik
Гость
« Ответ #3 : Январь 01, 2016, 20:05 »

Ключевое слово extern убирайте. Как один из вариантов, добавьте ключевое слово static для каждой константы.
Еще посмотрите, чтобы файл был один раз упомянут в списке .pro-файла.
Очистите, пересоберите проект.
/Проблема сохранилась
Записан
alik
Гость
« Ответ #4 : Январь 01, 2016, 20:10 »

в .h пихай только объявления, например extern const double Pi180;

в соответствующий .cpp пихай определения, например const double Pi180 = M_PI/180;
А вот этот вариант решил проблему! Спасибо.
Это был простой случай объявлений. Попробую подключить другие модули.

Сейчас мне пока сложно понять принцип подключения тех или иных модулей (хедеров):
1) Могу ли я подключать какой-либо хедер многократно (в разных cpp-файлах) внутри одного большого проекта?
2) Можно ли делать у двух хедеров ссылки #include друг на друга ? Или лучше, если надо кусок оттуда и кусок оттуда сделать третий хедер и сpp и там описать общие классы и типы ?
Записан
alik
Гость
« Ответ #5 : Январь 01, 2016, 20:43 »

в .h пихай только объявления, например extern const double Pi180;

в соответствующий .cpp пихай определения, например const double Pi180 = M_PI/180;
Возникла другая проблема - когда я в другом хедере, сославшись на хедер constants.h объявляю массив, например

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"
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4729



Просмотр профиля WWW
« Ответ #6 : Январь 04, 2016, 14:01 »

1) Могу ли я подключать какой-либо хедер многократно (в разных cpp-файлах) внутри одного большого проекта?
2) Можно ли делать у двух хедеров ссылки #include друг на друга ? Или лучше, если надо кусок оттуда и кусок оттуда сделать третий хедер и сpp и там описать общие классы и типы ?
1) да
2) вообще можно, но нежелательно — означает кривую архитектуру. лучше выделять в отдельный файл общие части, да.
в .h пихай только объявления, например extern const double Pi180;

в соответствующий .cpp пихай определения, например const double Pi180 = M_PI/180;
Возникла другая проблема - когда я в другом хедере, сославшись на хедер constants.h объявляю массив, например

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"

судя по всему, на момент обработки interfaces.h он еще не знает значения MAX_COUNT_REPER_ANGLE. можно решить это, сделав MAX_COUNT_REPER_ANGLE дефайном вместо константы: в constants.h #define MAX_COUNT_REPER_ANGLE 3
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.053 секунд. Запросов: 23.