|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
06.04.2014, 16:32 | #1 | |
Регистрация: 06.04.2014
Сообщений: 7
|
Ошибка: multiple definition of ...
Добрый день! Не получается скомпилировать программу, хотя вроде все переменные и функции объявлены правильно. Подскажите пожалуйста!
Программа состоит из четырёх файлов. Всё основное выполнение происходит в main.cpp, остальное - модули. primer.cpp Код:
Код:
Код:
Цитата:
|
|
06.04.2014, 18:51 | #2 |
Пользователь
Регистрация: 03.11.2010
Сообщений: 95
|
во-первых, раскидай декларацию функций в заголовочные файлы и подключай их, а не напрямую cpp - это неправильно.
Например: Файл Primer.h Код:
Код:
Последний раз редактировалось casekey; 06.04.2014 в 19:05. |
06.04.2014, 20:52 | #3 |
Регистрация: 06.04.2014
Сообщений: 7
|
casekey, спасибо Вам добрый человек большое!) Ваш способ помог!
А если не секрет, в чём разница, как подключать, через .cpp или через .h? И почему через .cpp не работает? Только сейчас начинаем c++ изучать в универе всех тонкостей не знаю... Кстати, если отдельно запускать программу с функцией Move_Disks, то работает без определения. Вот код: Код:
Последний раз редактировалось andrey_snegovik; 06.04.2014 в 21:00. |
06.04.2014, 21:20 | #4 | ||
Пользователь
Регистрация: 03.11.2010
Сообщений: 95
|
Цитата:
Цитата:
К примеру, можете проверить такой код: Код:
другое дело, если бы было так: Код:
Еще прочитайте про директиву include и что конкретно она делает с файлом при компиляции. В вашем примере функция Move_disks попала и в файл main.cpp и в файл primer.cpp. Линкер и сообщил что при линковке нашел две функции с определением. Прочитайте так же про эту директиву Код:
Код:
Последний раз редактировалось casekey; 06.04.2014 в 21:26. |
||
06.04.2014, 21:51 | #5 | |
Регистрация: 06.04.2014
Сообщений: 7
|
В принципе всё понятно, кроме одного момента.
Цитата:
Код:
|
|
06.04.2014, 23:26 | #6 |
Пользователь
Регистрация: 03.11.2010
Сообщений: 95
|
Я же говорю посмотри как работает include. Include подставил содержимое файла primer.cpp в мейн перед компиляцией после чего скомпилировал обьектный файл скажем main.o. аналогично скомпилировался primer.cop в primer.o. После чего линкер пытаеться слинковать эти два файла и видит что в обоих есть функции с одинаковыми именами и обе имеют тело
|
10.04.2014, 17:08 | #7 |
Регистрация: 06.04.2014
Сообщений: 7
|
casekey, ещё раз к Вам обращусь. Проблема в том, что мне в основную программу (main.cpp) нужно включать модули через заголовочные файлы.
Пример: Код:
Код:
Как теперь эти переменные перенести? На всякий случай прикладываю текущую структуру программы. lab_8.zip Заранее спасибо, очень выручаете! Последний раз редактировалось andrey_snegovik; 10.04.2014 в 18:17. |
10.04.2014, 17:38 | #8 |
Linux C++ Qt ARM
Старожил
Регистрация: 30.11.2008
Сообщений: 3,030
|
Во-первых перенести глобальные переменные в .h файл.
Во-вторых не использовать глобальные переменные (если без них можно обойтись). В-третьих глобальные константы можно задефайнить или заменить на перечисления. (в .h файле, причем если они реально глобальные то я бы их вынес вообще в отдельный .h файл). К стати, у меня компилятор ни на что не ругается. (Компилятор mingw32, IDE QtCreator 3.0.82) upd. И самое главное забыл - защитить .h файлы от повторного включения (include guard), как уже писалось выше. (и, по возможности, не используйте #pragma once - не все компиляторы это понимают, да и не обязаны они эту директиву понимать)
Дилетант широкого профиля.
"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс Последний раз редактировалось ROD; 10.04.2014 в 17:46. |
10.04.2014, 17:51 | #9 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
ток не забыть extern сделать, а в cpp оставить.
я обычно юзаю и то и то, и пока не видел компиля чтоб не понимал. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
10.04.2014, 18:02 | #10 |
Linux C++ Qt ARM
Старожил
Регистрация: 30.11.2008
Сообщений: 3,030
|
keil uVision не понимает (правда, кажется, он вообще include guard как-то не очень понимает, по крайней мере то, что работает в gcc, в кейле не компилируется)
Дилетант широкого профиля.
"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
C++ : multiple definition of main | AnryFlame | Помощь студентам | 2 | 16.10.2012 18:00 |
Ошибка error C2374: 'n' : redefinition; multiple initialization | inmanika | Помощь студентам | 5 | 13.12.2011 01:22 |
Ошибка: "Multiple-step operation generated errors. Check each status value" | artemavd | Общие вопросы Delphi | 4 | 23.10.2011 08:07 |
multiple definition | jojahti | Общие вопросы C/C++ | 9 | 20.08.2009 16:54 |
Qbasic ошибка "duplicate definition" | Костя КС | Помощь студентам | 5 | 26.05.2009 22:23 |