![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 | |
Регистрация: 06.04.2014
Сообщений: 7
|
![]()
Добрый день! Не получается скомпилировать программу, хотя вроде все переменные и функции объявлены правильно. Подскажите пожалуйста!
Программа состоит из четырёх файлов. Всё основное выполнение происходит в main.cpp, остальное - модули. primer.cpp Код:
Код:
Код:
Цитата:
![]() |
|
![]() |
![]() |
![]() |
#2 |
Пользователь
Регистрация: 03.11.2010
Сообщений: 95
|
![]()
во-первых, раскидай декларацию функций в заголовочные файлы и подключай их, а не напрямую cpp - это неправильно.
Например: Файл Primer.h Код:
Код:
Последний раз редактировалось casekey; 06.04.2014 в 19:05. |
![]() |
![]() |
![]() |
#3 |
Регистрация: 06.04.2014
Сообщений: 7
|
![]()
casekey, спасибо Вам добрый человек большое!) Ваш способ помог!
А если не секрет, в чём разница, как подключать, через .cpp или через .h? И почему через .cpp не работает? Только сейчас начинаем c++ изучать в универе всех тонкостей не знаю... Кстати, если отдельно запускать программу с функцией Move_Disks, то работает без определения. Вот код: Код:
Последний раз редактировалось andrey_snegovik; 06.04.2014 в 21:00. |
![]() |
![]() |
![]() |
#4 | ||
Пользователь
Регистрация: 03.11.2010
Сообщений: 95
|
![]() Цитата:
Цитата:
К примеру, можете проверить такой код: Код:
другое дело, если бы было так: Код:
Еще прочитайте про директиву include и что конкретно она делает с файлом при компиляции. В вашем примере функция Move_disks попала и в файл main.cpp и в файл primer.cpp. Линкер и сообщил что при линковке нашел две функции с определением. Прочитайте так же про эту директиву Код:
Код:
Последний раз редактировалось casekey; 06.04.2014 в 21:26. |
||
![]() |
![]() |
![]() |
#5 | |
Регистрация: 06.04.2014
Сообщений: 7
|
![]()
В принципе всё понятно, кроме одного момента.
Цитата:
Код:
|
|
![]() |
![]() |
![]() |
#6 |
Пользователь
Регистрация: 03.11.2010
Сообщений: 95
|
![]()
Я же говорю посмотри как работает include. Include подставил содержимое файла primer.cpp в мейн перед компиляцией после чего скомпилировал обьектный файл скажем main.o. аналогично скомпилировался primer.cop в primer.o. После чего линкер пытаеться слинковать эти два файла и видит что в обоих есть функции с одинаковыми именами и обе имеют тело
|
![]() |
![]() |
![]() |
#7 |
Регистрация: 06.04.2014
Сообщений: 7
|
![]()
casekey, ещё раз к Вам обращусь. Проблема в том, что мне в основную программу (main.cpp) нужно включать модули через заголовочные файлы.
Пример: Код:
Код:
Как теперь эти переменные перенести? На всякий случай прикладываю текущую структуру программы. lab_8.zip Заранее спасибо, очень выручаете! ![]() Последний раз редактировалось andrey_snegovik; 10.04.2014 в 18:17. |
![]() |
![]() |
![]() |
#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. |
![]() |
![]() |
![]() |
#9 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
ток не забыть extern сделать, а в cpp оставить.
я обычно юзаю и то и то, и пока не видел компиля чтоб не понимал. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
#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 |