multiple definitions |
Здравствуйте, гость ( Вход | Регистрация )
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: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
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
сразу полная реализация функций в этом-то и проблема. Си не паскаль. Разноси объявление в h, реализацию в cppА чтоб понять почему так: возьми cpp и мысленно воткни на место директивы препроцессора целиком соответствующий файл. Т.е. на место #include "filename", воткни сам файл с именем filename А потом представь, что каждый cpp компилируется в o, затем линкер соединяет эти o-файлы в исполняемый бинарь. И теперь подумай, как этот, последний, процесс выглядит и компилятор ругается 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 в заголовочных файлах лежит. |
|
|
Текстовая версия | Сейчас: 29.11.2024, 6:50 |