Russian Qt Forum

Qt => Общие вопросы => Тема начата: Konstantin от Январь 31, 2006, 19:59



Название: multiple definition(глюк,мой или Qt ?)
Отправлено: 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 даже заглянул  :)
Не могу найти причину.
Помогите!!!


Название: multiple definition(глюк,мой или Qt ?)
Отправлено: yshurik от Январь 31, 2006, 20:20
Файл инклудится пару раз в разные src файлы -> пару раз определяется переменная -> линкер не знает в каком .o правильная ссылка


Название: multiple definition(глюк,мой или Qt ?)
Отправлено: Dendy от Январь 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;


Название: multiple definition(глюк,мой или Qt ?)
Отправлено: KADABRA от Февраль 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
Надо хоть с С++ разбиратся :)


Название: multiple definition(глюк,мой или Qt ?)
Отправлено: Konstantin от Февраль 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 так же не рекомендуется использовать,кроме как внутри функций
 и классов.


Название: multiple definition(глюк,мой или Qt ?)
Отправлено: Вудруф от Февраль 07, 2006, 11:51
Хуже того, для статических данных компиляторы иногда забывают вызывать конструкторы :(