![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 24.12.2012
Сообщений: 82
|
![]()
Столкнулся с кучей проблем при разделении программы на модули.
постоянно получаю тонны ошибок линкера на тему "ссылка на неразрешенный внешний символ" или "ххх уже определен в ...". собственно как правильно поделить код по файлам? в книжке читал что феншуйно так: интерфейс класса в хедер и подключать везде, где используется этот класс + в хедере прописать #ifnfef ..... ну и дальше ясно реализацию в срр и сунуть в проект, а линкер там уж его найдет. но со временем все усложнилось: инлайн функции надо определять прямо в хедере, а то компил ругается шаблоны тоже, иначе получаю пресловутые ошибки из-за отсутствия инстанцирования при этом я не знаю как поступать с глобальными функциями, если написать в хедере их прототипы, а в срр реализации это тоже не всегда работает, почему то бывает линкер их не находит более того, когда в решении (пишу в visual studio) становится много проектов бывает линкер не находит и реализации классов (предположительно это из-за того что реализация в другом проекте), хотя если подключить реализацию, он ругнется на повторное определение как же все-таки сделать так что бы было удобно как со стандартными библиотеками? посоветуйте может книжку/статью... |
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 03.01.2013
Сообщений: 388
|
![]() |
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 24.12.2012
Сообщений: 82
|
![]()
я читал что переменные нужно extern, так и делаю (и все ок!), а вот функции extern не обязательно, т.е. слово просто пропускается, главное чтобы был прототип
или из хедера убрать #ifndef ...... и тогда будет ок? |
![]() |
![]() |
![]() |
#4 |
Форумчанин
Регистрация: 09.07.2013
Сообщений: 249
|
![]()
Попробуй все варианты включая предложенные и посмотри как лучше, потом отпишись ок?
do not use your brain
|
![]() |
![]() |
![]() |
#5 |
Пользователь
Регистрация: 24.12.2012
Сообщений: 82
|
![]()
отписываюсь:
для переменных extern необходим, и все работает для функций extern значения не имеет (проверил) пробовал убрать #ifndef из хедера (в котором функции глобальные) - проблемы не решает (ожидаемо), ведь ошибка не "не знаю что за функция", а "тело функции не найдено" могу добавить что если все методы определять внутри класса, то все работает, единственное, читать это мне абсолютно не нравится я пробовал кучу вариантов, и все это кончалось безумными времязатратами и брутом, как бы наконец угодить компоновщику, где достаточно хедера, а где придется сунуть срр |
![]() |
![]() |
![]() |
#6 |
Форумчанин
Регистрация: 03.01.2013
Сообщений: 388
|
![]()
#ifndef
#define #endif Директивы, в совокупности, осуществляющие защиту от переподключения заголовочных файлов, что может привести к проблеме неоднозначности имен в модулях приложения. |
![]() |
![]() |
![]() |
#7 |
Пользователь
Регистрация: 24.12.2012
Сообщений: 82
|
![]()
мне нужно в срр файлах(где реализации классов) везде прописать вот таких вот "стражей"? и в заголовочном файле тоже? я просто запутался что куда писать уже.
и должны ли быть имена после #define одинаковыми или разными? |
![]() |
![]() |
![]() |
#8 |
Форумчанин
Регистрация: 03.01.2013
Сообщений: 388
|
![]()
cpp файлы вы не подключаете, а вот headers - подключаете. В headers такая защита и ставиться.
Можете вместо этого использовать #pragma once (директива, разработанная Microsoft и включенная в Visual C++). |
![]() |
![]() |
![]() |
#9 |
Пользователь
Регистрация: 24.12.2012
Сообщений: 82
|
![]()
блин ну так ведь и делаю! но...
могут быть какие-то проблемы из-за того что не один проект, а несколько. потому что я помню раньше так делал и все работало |
![]() |
![]() |
![]() |
#10 | ||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]() Цитата:
она как бы не только там есть, и мс тут не причем. Цитата:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
||
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Delphi7 Многомодульная программа | viktor178 | Помощь студентам | 9 | 17.06.2013 20:03 |
Ошибки компоновщика при использовании С++ в WinForms | Jugger | Общие вопросы .NET | 1 | 31.03.2013 10:50 |
Ключи для компоновщика в Delphi | Altera | Общие вопросы Delphi | 7 | 05.03.2010 07:23 |
Ошибка компоновщика | senator2202 | Общие вопросы C/C++ | 11 | 13.12.2009 19:52 |
Настройка компоновщика в Builder 2009 | Innovator_King | C++ Builder | 1 | 01.10.2009 11:39 |