crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> multiple definitions
void*
  опции профиля:
сообщение 22.4.2010, 21:37
Сообщение #1


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


Всем привет. Есть один маленький проектик, при компиляции которого Qt Creator ругается на то что одни и те же функции объявляются несколько раз. Скорее всего это из-за множественного включения одних и тех же файлов, но как этого избежать и из-за чего именно это не понимаю). Структура такая(инклюдов):
defines.h

#ifndef DEFINES_H
#define DEFINES_H
//...
#endif // DEFINES_H

calculations.h

#ifndef CALCULATIONS_H
#define CALCULATIONS_H
#include "defines.h"
//...
#endif // CALCULATIONS_H

iterationsdialog.h

#ifndef ITERATIONSDIALOG_H
#define ITERATIONSDIALOG_H
#include "calculations.h"
//...
#endif // ITERATIONSDIALOG_H

iterationsdialog.cpp

#include "iterationsdialog.h"
#include "iterationtable.h"
//...

iterationtable.h

#ifndef ITERATIONTABLE_H
#define ITERATIONTABLE_H
#include "calculations.h"
//...
#endif // ITERATIONTABLE_H

iterationtable.cpp

#include "iterationtable.h"
//...

Ну и в файлах MainWindow уже подключается iterationsdialog.h и используется. Так вот проблема собственно в том, что все функции, описанные в calculations.h почему-то описываются несколько раз, на что и ругается компилятор... как это исправить?

Сообщение отредактировал void* - 22.4.2010, 21:38
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Litkevich Yuriy
  опции профиля:
сообщение 23.4.2010, 0:07
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(void* @ 23.4.2010, 2:23) *
сразу полная реализация функций
в этом-то и проблема. Си не паскаль. Разноси объявление в h, реализацию в cpp
А чтоб понять почему так:
возьми cpp и мысленно воткни на место директивы препроцессора целиком соответствующий файл.
Т.е. на место #include "filename", воткни сам файл с именем filename

А потом представь, что каждый cpp компилируется в o, затем линкер соединяет эти o-файлы в исполняемый бинарь.
И теперь подумай, как этот, последний, процесс выглядит

Цитата(void* @ 23.4.2010, 2:23) *
и компилятор ругается
Цитата(void* @ 23.4.2010, 2:23) *
error: collect2: ld returned 1 exit status
заметь, ругается не компилятор
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.11.2024, 12:29