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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DEADHUNT
  опции профиля:
сообщение 22.4.2010, 21:41
Сообщение #2


Активный участник
***

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

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




Репутация:   2  


Цитата(void* @ 22.4.2010, 22:37) *
Так вот проблема собственно в том, что все функции, описанные в calculations.h почему-то описываются несколько раз, на что и ругается компилятор... как это исправить?

так у тебя в *.h function declaration или function definition? если первое то ошибок быть не должно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 22.4.2010, 22:23
Сообщение #3


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

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

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




Репутация:   3  


сразу полная реализация функций
и компилятор ругается на каждую функцию типа multiple definition и в конце error: collect2: ld returned 1 exit status

Сообщение отредактировал void* - 22.4.2010, 22:55
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 23.4.2010, 0:07
Сообщение #4


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

Группа: Сомодератор
Сообщений: 9656
Регистрация: 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
заметь, ругается не компилятор
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 23.4.2010, 9:32
Сообщение #5


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

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

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




Репутация:   3  


да, спасибо, я то понимал что не компилятор ругается, но уже давненько не писал и забыл кое-какие нюансы)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
frg10
  опции профиля:
сообщение 27.4.2010, 16:16
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 47
Регистрация: 8.11.2009
Из: Ростов-на-Дону
Пользователь №: 1213

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




Репутация:   2  


Всякие мелкие функции можно писать полностью в заголовочных файлах, но нужно делать их inline - тогда линкер ругаться не будет. НО! это приводит к разбуханию кода, т.к. вместо вызова функции может вставиться её тело целиком (это решает компилятор).
П.С. Кстати, впомните, что весь STL в заголовочных файлах лежит.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 23.10.2020, 5:45