Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > multiple definition


Автор: kuvshinka 23.9.2011, 22:14
Код

mainwindow.cpp
#include "mainwindow.h"
#include "module1.cpp"
…

mainwindow.h
#include "unit2.h"
class Unit2;
…

unit2.cpp
#include "unit2.h"
#include "module1.cpp"
…

module1.h
#include …

struct StrukData
{
   int pole1;
   short pole2;
   char* pole3;
   …
};


module1.cpp
#include “module1.h”

const StrukData objStruk[10]=
{
   {..,…,},
   {…,…,}.
    …
};

смысл следующий - в 2 модулях - mainwindow и unit2 мне надо использовать данные из массива objStruk - соотвественно чтобы получить к нему доступ надо подключить файл его описания - module1.cpp, на что в модуле unit2.cpp выдаются ошибки:
error: multiple definition of  ‘objStruk’
first defined here: mainwindow.cpp
как мне исправить эту ошибку при условии того, что структуру модуля module1 трогать нежелательно...

Автор: mes 23.9.2011, 22:35
Цитата(kuvshinka @  23.9.2011,  21:14 Найти цитируемый пост)
как мне исправить эту ошибку при условии того, что структуру модуля module1 трогать нежелатель

подключать заголовочные файлы, прочитав перед этим повнимательнее книжки на эту тему..

Добавлено через 1 минуту и 21 секунду
и при чем тут кроссплатформенное программирование ?!

Автор: kuvshinka 23.9.2011, 23:56
mes: Вы имеете ввиду, что надо вместо module1.cpp подключать module1.h? это я и сама так думала, но тогда все равно в модуле unit2.cpp (то есть там, где я пытаюсь использовать массив objStruk) уже в ввиде "вопроса"  (в синем кружке знак вопроса) пишется 
undefined reference to objStruk (что верно, ведь массив объектов структуры objStruk, который я пытаюсь использовать, инициализирован в cpp-файле, а я подключаю хедер)
и ошибка
collect2: ld returned 1 exit status

Автор: mes 24.9.2011, 12:36
Цитата(kuvshinka @  23.9.2011,  22:56 Найти цитируемый пост)
 но тогда все равно в модуле

не все равно, а другая ошибка.. 
у вас не прилинкована та часть в которой массив..

Автор: kuvshinka 24.9.2011, 12:47
mes: а как ее прилинковать? как исправить эту ошибку? 

Автор: mes 24.9.2011, 13:38
Цитата(kuvshinka @  24.9.2011,  11:47 Найти цитируемый пост)
 как ее прилинковать? как исправить эту ошибку?  

если компилируете в IDE, то добавить исходник к проекту.. 


Автор: volatile 24.9.2011, 15:38
kuvshinka, в .h файле напишите:
extern const StrukData objStruk[10];
и подключайте его где нужно, сколько угодно.
а .cpp оставьте только 1 раз.

Автор: kuvshinka 24.9.2011, 18:31
mes: я компилирую в Qt Creator-e 4.6....какой именно исходник надо подключить к проекту? у меня и так все указанные выше модули (их cрр- и h -файлы) подключены в pro-файле проекта...

Добавлено через 11 минут и 59 секунд
volatile: в каком именно моем h - файле надо написать:
extern const StrukData objStruk[10];
и что значит "а .cpp оставьте только 1 раз." (опять же какой именно cpp-файл и что значит "оставить"?)

Автор: volatile 24.9.2011, 22:23
Цитата(kuvshinka @  24.9.2011,  18:31 Найти цитируемый пост)
же какой именно cpp-файл и что значит "оставить"?) 

Это ваш сипипи. Назовём его kuvshinka.cpp
Цитата(kuvshinka @  23.9.2011,  22:14 Найти цитируемый пост)
const StrukData objStruk[10]=
{
   {..,…,},
   {…,…,}.
    …
};
Его дабавляете в проект 1 раз, естественно. И никуда больше не включаете.

А это ваш хедер, назовём его kuvshinka.h
Цитата(volatile @  24.9.2011,  15:38 Найти цитируемый пост)
extern const StrukData objStruk[10];

Ну и там где надо, (да не запрещено даже там, где не надо), добавляете:
#include “kuvshinka.h”


Автор: mes 25.9.2011, 12:15
Цитата(volatile @  24.9.2011,  21:23 Найти цитируемый пост)
Назовём его kuvshinka.cpp

const по умолчанию имеет внутренее связывание, поэтому в cpp также нужно не забыть extern 
Код

extern const StrukData objStruk[10]=
{ ...
};


Автор: math64 26.9.2011, 09:33
Можно ещё так:
Код

// module1.h
struct StrukData { ... };
const StrukData* getStrukData();
int getStruktDataCount();
//module1.h
const StrukData objStruk[] = // Размер можно не указывать, компилятор сам посчитает.
{
};
// Вычисление размера - автоматически при добавлении данных
const int objStrukCount = sizeof(objStruk)/sizeof(objStruk[0]);
// Получить данные
const StrukData* getStrukData() { return objStruk; }
// Получить число данных
int getStruktDataCount() { return objStrukCount; }
//mainwindow.cpp, unit2.cpp
#include "module1.h"

void someFunction() {
  const StrukData* data = getStrukData();
  const int count = getStrukCount();
  for(int i = 0; i < count; i++) {
     doSomething(data[i]);
  }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)