так как каждый модуль компилируется независимо, то вышеприведенный "столбик" воспринимается компилятором всякий раз ВПЕРВЫЕ. этот столбик позволяет избежать повторов в рамках одного файла, но никак не в рамках одного проекта! то есть если header1.h содержит в себе #include "demo.h", и header2.h содержит #include "demo.h", то если бы не было этого столбика в demo.h, компиляция следующего модуля была бы с ошибкой:
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#5902
ValBag(Пользователь)
Новичок
Постов: 8
В ответ на: Модульная программа 09.12.2010 14:54
Репутация: 0  
ARV писал(а): так как каждый модуль компилируется независимо, то вышеприведенный "столбик" воспринимается компилятором всякий раз ВПЕРВЫЕ. этот столбик позволяет избежать повторов в рамках одного файла, но никак не в рамках одного проекта!Вот! Вы верно уловили суть, что я не туда "грёб" и держал в голове весь проект. И это очень существенный момент, который был мной не понят. Спасибо. Теперь картина проясняется. Тогда, если я правильно понял, присоединяя к модулям кучу заголовков с неповторяющимся текстом, можно избежать (в принципе) обрамления их содержимого такой защитой? Когда пишут, что такие меры нужны для предотвращения дублирования переменных, то под эту категорию попадают также прототипы функций и макросы? А что еще?
P.S. Почему-то дублируется пост. Отправляю после предпромотра. Удалить не знаю как.
Содержимое поста отредактировано: ValBag, в: 09.12.2010 14:57
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#5904
ARV(Администратор)
Администратор
Постов: 2386
В ответ на: Модульная программа 09.12.2010 18:31
Репутация: 176  
термин "избежать" подразумевает принятие особых мер. если вы в качестве этих мер решили держать в голове все объявления и взаимосвязи между ними для проекта с большим числом файлов - ваше право, но куда как проще сделать "обрамление" и не забивать голову этими заботами.
на счет переменных я уже говорил: не место из объявлениям в хидерах! соответственно, при правильном составлении хидера нет проблемы с переобъявлением переменных. ну а неправильное - оно неправильное и есть, что о нем говорить
если встретится 2 макроса, то компилятор среагирует на это варнингом, т.к. переобъявление макросов допстимо в принципе. вероятность задвоения прототипов функций существует, если вы именуете их по принципу "покороче, побскорее". вероятность того, что в функционально разных модулях встретится определение функции get_day_of_week() - достаточно мала, согласитесь а вот встретить повторение функции sum() вероятнее намного. некоторые предваряют именя функций сокращенным обозначением модуля, например, все функции в модуле статистических вычислений начинаются со stat_, а в модуле работы с дисплеем - с lcd_. стиль оформления своих исходников вы сами должны выбрать: для личных проектов догм и законов нет, а общие рекомендации - дело весьма расплывчатое...
Не стыдно не знать, стыдно не учиться
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#5906
ValBag(Пользователь)
Новичок
Постов: 8
В ответ на: Модульная программа 10.12.2010 08:23
Репутация: 0  
ARV писал(а): термин "избежать" подразумевает принятие особых мер.Я имел в виду - теоретически ("в принципе").на счет переменных я уже говорил: не место из объявлениям в хидерах!Этот момент понятен. Отсюда выпадают только внешние переменные, с их объявлением в заголовочных файлах - им больше некуда "пристроится". Спасибо большое за помощь! Надеюсь на это в дальнейшем, при очередных трудностях.
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#6143
Apparatchik(Пользователь)
Специалист
Постов: 123
В ответ на: Модульная программа 07.02.2011 19:49
Репутация: 0  
У меня есть рабочая программа, но она большая и неудобно по ней "бегать". В ней есть функции, которые производят астрономические расчёты (использую для регулировки яркости). Для того, чтоб сделать плавную смену цифр и исправить динамическую индикацию и мож ещо что решил вынести эти функции в отдельный файл чтоб немешали "бегать" и код основного файла существенно уменьшился бы. Думал просто перенести их в файл.h но теперь сомневаюсь. Да и там есть такие переменные, которые нужно брать из основного файла например месяц, год, дата, флаг летнего времени и наоборот есть такие переменные которым присваивают значения эти функции и они нужны в основном файле (на основании их значения производятся действия).
Почитав эту ветку я теперь совсем запутался как поступать: либо перенести их в файл.h либо в файл.с но в этом случае как правильно сказать main где они
в обоих случаях как быть с переменными? или лучше передавать нужные данные в параметрах функции, неувеличится ли при этом прошивка (осталось мало места)?
Содержимое поста отредактировано: Apparatchik, в: 07.02.2011 19:53
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#6147
ARV(Администратор)
Администратор
Постов: 2386
В ответ на: Модульная программа 08.02.2011 00:11
Репутация: 176  
Apparatchik писал(а): Почитав эту ветку я теперь совсем запутался как поступать: либо перенести их в файл.h либо в файл.с но в этом случае как правильно сказать main где они
в обоих случаях как быть с переменными? или лучше передавать нужные данные в параметрах функции, неувеличится ли при этом прошивка (осталось мало места)?прочтите еще раз, а может и два... я старался ответить на вопрос "как следует поступить"... не хотелось бы повторяться... повторюсь только в одном: в хидерах не должно быть никаких функций
а по поводу размера прошивки - скорее всего она увеличится, но несущественно, не в разы.
Не стыдно не знать, стыдно не учиться
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#7900
FreshMan(Пользователь)
Специалист
Постов: 177
В ответ на: Модульная программа 14.12.2012 01:21
Репутация: 1  
зачем в хидере прототипы ф-ций ? они нужны чтобы эти ф-ции были нужны в других модулях ? а если они не понадобятся то и включать в хидер их не надо ?
Experience is the name everyone give to his mistakes.
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#7901
ARV(Администратор)
Администратор
Постов: 2386
В ответ на: Модульная программа 14.12.2012 08:49
Репутация: 176  
FreshMan писал(а): зачем в хидере прототипы ф-ций ? они нужны чтобы эти ф-ции были нужны в других модулях ? а если они не понадобятся то и включать в хидер их не надо ?не смотря на то, что язык Си оставляет на вольное усмотрение программиста очень и очень многое, традиционно сложилось так, что все нужные хидеры перечисляются директивами #include в самом начале любого исходного файла. таким образом, если в хидере имеется прототип функции, то весь модуль с этим хидером в начале "знает" об этой функции, т.е. использовать ее можно в любом месте. если же прототипа функции в хидере нет, то функция в модуле начинает существовать только после своего появления в тексте исходника. то есть если функция foo() обращается к функции fee(), то по тексту исходника fee() обязательно должна быть определена раньше, чем foo(). если же обе функции описаны в хидере, они могут располагаться в исходнике совершенно произвольно.
таким образом, размещение прототипов функций в хидерах это: 1. хороший стиль программирования 2. возможность не заботиться о порядке реализации функций в модулях 3. возможность дать знать одним модулям о наличии функций из других модулей
подводя итоги: все это не обязательно, но желательно.
P.S. то же самое относится и к описаниям глобальных переменных. только следует помнить, что в хидерах можно описывать переменные только с префиксом extern, без этого переменные в хидерах не должны упоминаться. учтите, что описание с префикосм extern это именно ОПИСАНИЕ, но не ОПРЕДЕЛЕНИЕ, т.е. запись extern int k; лишь уведомляет компилятор о наличии "где-то" переменной k типа int, но вовсе не выделяет память под нее. т.е. где-то в исходниках обязательно должна быть запись int k; иначе будет ошибка компоновщика (линкера)
Содержимое поста отредактировано: ARV, в: 14.12.2012 08:52
Не стыдно не знать, стыдно не учиться
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#7902
FreshMan(Пользователь)
Специалист
Постов: 177
В ответ на: Модульная программа 14.12.2012 20:04
Репутация: 1  
допустим у меня есть некая ОДНОМОДУЛЬНАЯ программа
в таком стиле как она написана счас нужны ли ей хидеры с прототипами функций ?
или же, если я вас правильно понял, хидер с прототипами функций будет нужен тогда когда ф-ции SetScreen (char raz1_2, char raz3_4, char d) и SetTime () будут описаны после ГЛАВНОЙ функции ?
Содержимое поста отредактировано: FreshMan, в: 14.12.2012 20:05
Experience is the name everyone give to his mistakes.
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#7903
ARV(Администратор)
Администратор
Постов: 2386
В ответ на: Модульная программа 14.12.2012 21:34
Репутация: 176  
вы поняли правильно. при этом SetScreen не может использовать внутри себя SetTime. в вашем случае хидер с прототипами не нужен. кстати, в одномодульной программе прототипы можно делать прямо в основном файле без отдельного хидера.
Не стыдно не знать, стыдно не учиться
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.