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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: multiple definition(глюк,мой или Qt ?)  (Прочитано 12914 раз)
Konstantin
Гость
« : Январь 31, 2006, 19:59 »

Начал писать небольшой проектик(мой первый с qt и вообще GUI).
Всё собирается , хотел добавить разпознавания типа текстового файла(чисто спец. вещь)
datatypes.h
Код:

#ifndef DATA_TYPES
#define DATA_TYPES

#include <QMap>
#include <QStringList>

namespace DataType{
enum DATA_TYPE{
TEXT=1,
OSP_500,
FANUC,
SIEMENS_840D_DMG,
SIEMENS_840D_HELLER,
};
//const char* word="abcde";
//QString bla_bla_bla;
//QMap<DATA_TYPE,QStringList> identWords;
}

#endif


При добавлении любого из закомментированных обьявлений(Нужно только последнее,остальное для пробы)
выдаёт следующее:
Код:

mainwindow.o:/usr/local/Trolltech/Qt-4.1.0/include/QtCore/qchar.h:36: multiple definition of `DataType::identWords'
docwindow.o:/usr/local/Trolltech/Qt-4.1.0/include/QtCore/qchar.h:36: first defined here
moc_docwindow.o:/usr/local/Trolltech/Qt-4.1.0/include/QtCore/arch/qatomic.h:60: multiple definition of `DataType::identWords'
docwindow.o:/usr/local/Trolltech/Qt-4.1.0/include/QtCore/qchar.h:36: first defined here
collect2: ld returned 1 exit status


Я в непонятках , имена все попеременял,в qchar.h даже заглянул  Улыбающийся
Не могу найти причину.
Помогите!!!
Записан
yshurik
Гость
« Ответ #1 : Январь 31, 2006, 20:20 »

Файл инклудится пару раз в разные src файлы -> пару раз определяется переменная -> линкер не знает в каком .o правильная ссылка
Записан
Dendy
Гость
« Ответ #2 : Январь 31, 2006, 21:15 »

Файл инклудится больше одного раза, что в принципе нормально.
Проблема с определением переменньІх:

1. Константная переменная должна бьІть определена в заголовочнике так:

Код:
const char * word = "abcde"; // WRONG
static const char * word = "abcde"; // RIGHT


Теперь на етапе компиляции компилер заюзает для каждого из cpp-файлов свою константу в пределах етого файла (что и означает слово static), но в результате оптимизаций статические данньІе в коде будут одни.

2. Неконстантная переменная должна бьІть только обьявлена в заголовочнике с помощью ключевого слова extern, определена же - в cpp-файле:

Код:
QString bla_bla_bla; // WRONG
extern QString bla_bla_bla; // RIGHT


В одном и только в одном заголовочнике должно бьІть её определение, иначе линкер честно обругается:

один из cpp
Код:
QString bla_bla_bla;
Записан
KADABRA
Гость
« Ответ #3 : Февраль 01, 2006, 11:20 »

Код:

#ifndef DATA_TYPES
#define DATA_TYPES

#include <QMap>
#include <QStringList>

namespace DataType{
   enum DATA_TYPE{
      TEXT=1,
      OSP_500,
      FANUC,
      SIEMENS_840D_DMG,
      SIEMENS_840D_HELLER,
   };
const char* word="abcde";
::QString bla_bla_bla;
::QMap<DATA_TYPE,QStringList> identWords;
}

#endif


добавлено спустя 1 минуту:

 Konstantin
Надо хоть с С++ разбиратся Улыбающийся
Записан
Konstantin
Гость
« Ответ #4 : Февраль 01, 2006, 13:18 »

Цитата: "KADABRA"
Код:

#ifndef DATA_TYPES
#define DATA_TYPES

#include <QMap>
#include <QStringList>

namespace DataType{
   enum DATA_TYPE{
      TEXT=1,
      OSP_500,
      FANUC,
      SIEMENS_840D_DMG,
      SIEMENS_840D_HELLER,
   };
const char* word="abcde";
::QString bla_bla_bla;
::QMap<DATA_TYPE,QStringList> identWords;
}

#endif


добавлено спустя 1 минуту:

 Konstantin
Надо хоть с С++ разбиратся Улыбающийся


Так вот пытаюсь разобраться.
Заглянул в Страуструпа.
Он не рекомендует определять данные(не конст.) в заголовниках
типа

Код:

::QString bla_bla_bla;
::QMap<DATA_TYPE,QStringList> identWords;


Только обьявления или определения констант.

Код:

extern int var;
const int varConst;


Обьявление с ключевым словом static так же не рекомендуется использовать,кроме как внутри функций
 и классов.
Записан
Вудруф
Гость
« Ответ #5 : Февраль 07, 2006, 11:51 »

Хуже того, для статических данных компиляторы иногда забывают вызывать конструкторы Грустный
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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