Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 23.02.2018, 03:18  
DPANYTA
Прописка
 
Аватар для DPANYTA
 
Регистрация: 25.11.2008
Сообщений: 113
Сказал спасибо: 3
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
DPANYTA на пути к лучшему
По умолчанию Препроцессор, линкёр...

Пробую ваять на C (Atmel Studio 7).
С помощью урока (сумбурно там слегка) въехал в такую работающую конструкцию:

Каждый из c "подтягивает" свой h. А main.h "подтягивает" (взаимно) всех остальных h.

Этот набор стрелок может быть ТОЛЬКО таким?
Или горизонтальные можно "поднять" до .h ?
Или "диагональный вариант" - все include в main.c. Допустимо?
Или ещё какие варианты...

Практические уроки с примерами, скриншотами - здорово.
Но хотелось бы понимания. Не только как, но и почему.

Где за всё это почитать?
Реклама:
DPANYTA вне форума  
Непрочитано 23.02.2018, 03:38  
AR_Favorit
Почётный гражданин KAZUS.RU
 
Регистрация: 13.03.2010
Сообщений: 2,901
Сказал спасибо: 499
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию Re: Препроцессор, линкёр...

Линкер фактически просто берет файл, указанный в директиве #include, и подставляет его содержимое аккурат на место этой самой директивы. Благодаря чему в файле, куда подставлено это содержимое, становятся указаны собранные в .h-файлах объявления внешних функций, переменных, типов, определений, для чего обычно* эти файлы и используются.

(*хотя можно извратиться, и, например, где-нить в теле функции вместо ее кода написать "#include "xxx.h", а в файле xxx.h - собственно программные строки функции, линкер подставит содержимое h-файла в указанноге место и всё откомпилируется, как и должно, но востребованность такого решения - под большим вопросом)))

Исходя из этого, если вы включаете другие .h-файлы в main.h - можно во всех .c-файлах указывать #include "main.h" и всё...

Так всегда и делаю. Для проектов не слишком большого масштаба, которыми являются программы для МК, вполне годно.

Ваш же набор стрелок может быть любым, вплоть до того, что в каждом .c-файле включен только "свой" .h-файл, в котором перечислены нужные именно этому .с-файлу внешние переменные, функции, и т.д. из других модулей.

Последний раз редактировалось AR_Favorit; 23.02.2018 в 03:45.
AR_Favorit вне форума  
Непрочитано 23.02.2018, 06:50  
DPANYTA
Прописка
 
Аватар для DPANYTA
 
Регистрация: 25.11.2008
Сообщений: 113
Сказал спасибо: 3
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
DPANYTA на пути к лучшему
По умолчанию Re: Препроцессор, линкёр...

А на кой вообще нужны эти .h-файлы?
Без них никак?

И ещё. В .h-файлах можно делать определение функций, т.е. располагать собственно саму функцию, её тело?
Или только #include и #define?
DPANYTA вне форума  
Непрочитано 23.02.2018, 09:59  
akegor
Гуру портала
 
Аватар для akegor
 
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,841
Сказал спасибо: 2,531
Сказали Спасибо 11,764 раз(а) в 5,895 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: Препроцессор, линкёр...

Сообщение от DPANYTA Посмотреть сообщение
А на кой вообще нужны эти .h-файлы?
Без них никак?
Можно. А Вам не приходилось разбираться в десятикилометровой портянке, где все в общей куче, одним файлом?
У меня часто в майне вообще линейный (или с небольшим ветвлением) набор кубиков, которые расписаны отдельно, причем, часто тоже с применением кубиков (функций, определенных отдельно). Разбираться очень просто. Сразу видна структура и порядок выполнения. При нормальных именах функций и переменных даже комментарии часто излишни.
Мои "соседи по камере" любят портянки в CV. Я не хочу в них ковыряться.
Думаю, этим ответил и на следующий вопрос.
Сообщение от AR_Favorit Посмотреть сообщение
Исходя из этого, если вы включаете другие .h-файлы в main.h - можно во всех .c-файлах указывать #include "main.h" и всё...
Не, ну не все так просто... Подводных камушков много. Множественные определения и тому прочее. Нужно хорошо думать, ифндеф не всегда спасает. Разное отношение компиляторов к переопределениям: один пропускает - ему все в порядке, другой выдает предупреждение, третий это считает ошибкой. Хуже всего, когда пропускает. Искать такую логическую ошибку весьма трудно.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
akegor вне форума  
Непрочитано 23.02.2018, 10:36  
ampy
Гражданин KAZUS.RU
 
Регистрация: 22.07.2007
Адрес: Владивосток
Сообщений: 984
Сказал спасибо: 435
Сказали Спасибо 375 раз(а) в 197 сообщении(ях)
ampy на пути к лучшему
По умолчанию Re: Препроцессор, линкёр...

Смысл инклудов мне кажется должен быть в том, что они описывают интерфейс к некоему функционалу, а в сишном файле производится его реализация, конкретное наполнение. Включение заголовка в свой сишный файл гарантирует соответствие интерфейса и реализации. Если у main.c нет интерфейса, то и заголовок не нужен.

Интерфейс это объявления функций и переменных, без тела и начальных значений.

Но механизм этих инклюдов такой примитивный, что никто не застрахован от того, чтобы наворотить огород, т.е. отойти от концепции интерфейс-реализации и делать что в голову взбредет.

Если во вспомогательных файлах используются глобальные переменные программы, то можно объявить их в main.h, но придется страховаться от повторного включения. Но лучше "для чистоты эксперимента" их отдельно определить - типа global.c/global.h. Либо назвать main.h, но никаких include - только объявления глобальных переменных и функций.

Линкер тут ни при чем, т.к. он собирает из объектных двоичных файлов и библиотек готовую программу. С текстом работает компилятор.
ampy вне форума  
Непрочитано 23.02.2018, 11:05  
akegor
Гуру портала
 
Аватар для akegor
 
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,841
Сказал спасибо: 2,531
Сказали Спасибо 11,764 раз(а) в 5,895 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: Препроцессор, линкёр...

Сообщение от ampy Посмотреть сообщение
Линкер тут ни при чем, т.к. он собирает из объектных двоичных файлов и библиотек готовую программу.
Не совсем. Он может отловить ошибку, которую пропустил компилятор. В этом случае поиск ошибки гораздо сложнее именно из-за того, что он собирает из объектных модулей. Сразу скажу, что пример не приведу- бывает это нечасто и в памяти отложился только факт.
Сообщение от ampy Посмотреть сообщение
Интерфейс это объявления функций и переменных, без тела и начальных значений.
Несогласен относительно начальных значений. Начальные значения в заголовочном файле удобней. Типа паблика в плюсах. Но тут тоже надо делать разницу между "текущими" (проще модифицировать) и "типа библиотечными" или стандартными из набора среды разработки (или стандартных библиотек к чипу) - там нехрен ковыряться, можно только посмотреть.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
akegor вне форума  
Непрочитано 23.02.2018, 11:37  
STM32F0
Заблокирован
 
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
STM32F0 на пути к лучшему
По умолчанию Re: Препроцессор, линкёр...

Сообщение от DPANYTA Посмотреть сообщение
Где за всё это почитать?
http://www.pic24.ru/doku.php/osa/art...without_errors
http://www.pic24.ru/doku.php/osa/articles/modules
STM32F0 вне форума  
Непрочитано 23.02.2018, 11:39  
STM32F0
Заблокирован
 
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
STM32F0 на пути к лучшему
По умолчанию Re: Препроцессор, линкёр...

Сообщение от akegor Посмотреть сообщение
Мои "соседи по камере" любят портянки в CV.
Прибейте им табличку на дверь "Зверей не кормить!"(с).
STM32F0 вне форума  
Непрочитано 23.02.2018, 12:11  
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,246
Сказал спасибо: 11,165
Сказали Спасибо 3,854 раз(а) в 2,925 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: Препроцессор, линкёр...

Немного неточностей в определениях для начала.
Классически последовательность компиляции состоит из препроцессора и собственно компилятора.
Линкер уже следующий этап с сборкой объектных кодов в исполняемый файл.
Задача препроцессора именно преобразование его директив в код для компилятора.
Эти директивы содержатся как в самом коде (.c файлы), так и в заголовках (.h файлы).
Формально можно и без заголовков обойтись - #include вполне позволяют подключать и сами файлы кода .

DPANYTA По теме стоит просто открыть и почитать первоисточник - книгу Кернигана и Ритчи "Язык программирования C". Там это все разложено по полочкам. Ну и для конкретной среды потом почитать особенности реализации.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
mike-y-k вне форума  
Непрочитано 23.02.2018, 12:25  
akegor
Гуру портала
 
Аватар для akegor
 
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,841
Сказал спасибо: 2,531
Сказали Спасибо 11,764 раз(а) в 5,895 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: Препроцессор, линкёр...

Сообщение от mike-y-k Посмотреть сообщение
По теме стоит просто открыть и почитать первоисточник - книгу Кернигана и Ритчи "Язык программирования C". Там это все разложено по полочкам.
Не со всем согласен. Там основы. Но. Все течет, все изменяется. Меняются подходы. "С" достаточно гибкий механизм, допустимы большие отклонения и извращения. Тут уж "на вкус и цвет...". Частично отклонения и извращения реализованы в ИДЕ, частично каждым конкретным индивидом. Но нужно читать, чтобы не ходить по известным граблям или чтобы определить, какие грабли наиболее приемлемы.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
akegor вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 18:47.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot