Easyelectronics.ru

Электроника для всех
Текущее время: 22 авг 2019, 21:03

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 26 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Вопрос по подключению header
СообщениеДобавлено: 26 июл 2017, 12:59 
Старожил

Зарегистрирован: 24 июн 2011, 14:05
Сообщения: 293
Откуда: Новочеркасск
Примерно суть проблемы такая: есть один хидер (назовём Project.h) в котором включены все хидеры для проекта (ну чтоб к файлам проекта подключать только Project.h), например такие как: perif.h, type.h, valua.h.
В хидере type.h обьявлен тип Uint16, а вот если в хидере valua.h определить переменную как внешнюю
Код:
extern Uint16 temp;

то имеем ошибку:
Код:
identifier "Uint16" is undefined

В Project.h выше type.h, ниже valua.h.
Конечно если в valua.h включить type.h то всё хорошо, но ведь должно и так работать, но что-то не доделано видимо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по подключению header
СообщениеДобавлено: 26 июл 2017, 13:06 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3532
Ооо, "шо, апять" хидеры-инклюды? :) :) :) Надож, какая злободневная тема то.
Тут в "активных темах" рядышком висит тема про сишние исходники и хидеры, где я написал целый, блин, трактат на тему порядков подключений хидеров и того, чего там и как...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по подключению header
СообщениеДобавлено: 26 июл 2017, 14:16 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 651
Откуда: Германия
Общее правило - каждый файл должен включать те хидеры, которые он использует и не надеяться, что кто-то их уже включил.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по подключению header
СообщениеДобавлено: 26 июл 2017, 14:44 
Старожил

Зарегистрирован: 24 июн 2011, 14:05
Сообщения: 293
Откуда: Новочеркасск
dev, примерно такая проблема и была, не мог найти куда вставить нужный header. Вставил хидер с описанием типов в файл valua.c


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по подключению header
СообщениеДобавлено: 26 июл 2017, 16:05 
Заглядывает иногда

Зарегистрирован: 15 ноя 2015, 12:11
Сообщения: 173
ELEKTROS писал(а):
есть один хидер (назовём Project.h) в котором включены все хидеры для проекта (ну чтоб к файлам проекта подключать только Project.h)

Понятно, что речь идёт об объёмах кода микроскопических и выигрыш во времени компиляции - миллисекунды, но всё-же, всё-же, всё-же... Любая правка в самом даже заштатном хидере включённом в project.h по зависимостям устроит проекту всеобщую рекомпиляцию. Помимо хорошего правила подключать только те .h-интерфейсы, что реально требуются текущему .c-модулю, есть к этому правилу дополнение - .h-интерфейс самого модуля #include-ить самым первым, чтобы сделать его более "самодостаточным" и менее зависимым от места включения в других .c-модулях.
А спагетти с #include-ами хорошо разгребать по "портянке" препроцессора - т.е. файлу который остается после разворачивания всех директив (и скармливается компилятору). В зависимости от используемого тулчейна - этот .pp-файл либо в папке с временными файлами компиляции живёт, либо можно настроить компилятор, чтобы он их не удалял по ненадобности, либо временно включить компилятор в режиме "preprocess only".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по подключению header
СообщениеДобавлено: 26 июл 2017, 16:16 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5616
BusMaster писал(а):
Ооо, "шо, апять" хидеры-инклюды? :) :) :) Надож, какая злободневная тема то.


А чему удивляться? Здесь большинство взрощенно на облегчалках и понятие процесса компиляции и структуры проекта не имеют напрочь


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по подключению header
СообщениеДобавлено: 26 июл 2017, 17:02 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3532
Дык, со структурой проекта и бывалым случается запутаться :) иной раз сам наворотишь такого, что... вопщем :)

Вообщет, файл с описанием типов вставляйте в каждый файл исходника, в позиции раньше, чем подключаете хидер этого исходника. В сам хидер толкать файл описания типов не нужно. В хидере никаких extern-ов лучше не объявлять, разве что если хотите запутаться в перекрестных связях. Переменные, положенные в хидер, будут работать на один уровень вложенности. Не совайте в хидеры всё сразу, чем проще перекрестные связи, тем легче вам же. Зарисовывайте на бумажке связи - очень помогает.
По большому счету, файл описания типов - это typedef <там_по_цепочке_проследить> <базовый_тип_языка_Си>. То есть, все пользовательские типы в конечном счете по цепочке приводят к базовым типам int, unsigned int, short unsigned int, char, ну и так далее.
Если у вас есть целая группа стандартных файлов, которые вы подключаете ко всем файлам, напишите файл std_header.h, подключите в него ваши стандартные файлы типа <stdint.h>, <stdio.h>, <string.h>, <stdlib.h>, и теперь подключайте ваш std_header.h ко всем файлам исходников (.c), в которых нужны эти стандартные файлы. Бывает, что не во всех файлах нужен одинаковый набор хидеров. Создайте еще один файл, в который поместите нужные хидеры и подключайте его выборочо в нужные исходники.
Будьте осторожны с переменными в хидерах. Если у вас во всем проекте есть некий набор глобальных переменных, действующих на весь проект, объявите их в main.c или создайте файл global_variables.c и объявите их там. А в остальных файлах исходников либо объявляйте их как extern, либо создайте хидер global_variables.h, запишите в нем переменные как extern и подключайте к файлам исходников.


Последний раз редактировалось BusMaster 26 июл 2017, 17:31, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по подключению header
СообщениеДобавлено: 26 июл 2017, 17:29 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2614
Откуда: Санкт-Петербург
Правило хорошего тона - делать, как dev сказал.

Порядок подключения хидеров не должен влиять на результат компиляции. Соответственно, в каждом хидере запрет повторного включения (#ifndef __FOO_H__ #define __FOO_H__ ...#endif или просто #pragma once) и каждый хидер включает все другие хидеры, на которые ссылается.

А описание ТС выглядит так, будто у него valua.h почему-то компилится, как c-файл, или же включён в ещё один c-файл без подключения type.h.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по подключению header
СообщениеДобавлено: 26 июл 2017, 17:56 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3532
Не совсем так. (не про блокировку повторных подключений, а про ссылки).
Допустим, у нас есть пара файлов LCD.c, LCD.h, в хиреде LCD.h прописано подключение используемого этими файлами хидера описания аппаратной части микроконтроллера MCU.h. И еще у нас есть пара файлов print.c, print.h. Мы подключаем LCD.h к print.h, потому что вроде как print.h ссылается на LCD.h. А потом print.h подключаем к main.c. В результате такой цепочки, в main.c вытягивается всё то барахло, что лежало на самом дне в MCU.h.
Вроде бы в этом конкретном случае оно не так страшно, но детально разобравшись - вопрос - а на кой черт на верхний уровень всплыло то, че должно лежать на дне? Представьте, что там в нижних хидерах прототипы функций нижнего уровня (например void SendLCD(int);), а вы их выдернули на верхний, собирая по пути всю грязь с низов.
Так что аккуратнее, аккуратнее с хидерами. Не все йогурты одинаково полезны :) Рисуйте на бумажке связи.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по подключению header
СообщениеДобавлено: 26 июл 2017, 18:11 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5616
BusMaster писал(а):
Будьте осторожны с переменными в хидерах.

Какие на переменные, может речь о ссылках на них(extern)? В хЭдерах не должно быть сущностей ...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по подключению header
СообщениеДобавлено: 26 июл 2017, 18:55 
Старожил

Зарегистрирован: 24 июн 2011, 14:05
Сообщения: 293
Откуда: Новочеркасск
aamonster, у меня valua.с - это файл с обьявленными глобальными переменными, соответственно в valua.h переменные определены как extern. Да нужно файл с типами было куда-то подцепить, в итоге подцепил в valua.с (второй случай как вы написали).
Ну чё, развиваемся. Очень давно заготовку сделал и всегда ей пользовался, а тут решил всё перефигачить и убрать лишнее, вот и случился разрыв шаблона :).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по подключению header
СообщениеДобавлено: 26 июл 2017, 21:02 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2614
Откуда: Санкт-Петербург
BusMaster, это решается иначе: то, что не нужно в самом хидере - выносится в c-файл.
В вашем примере по хорошему в print.h описаны только прототипы функций и константы, а LCD.h включается в print.c.

Если же вам в print.h надо что-то из LCD.h (плохо) - то неважно, подключите вы их последовательно или один из другого - всё равно втянется всё.

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

Грубо говоря, если вы подключили любой ваш хидер и ничего кроме него - не должно быть ошибок компиляции (только ошибки линковки).

Ещё раз правила в чуть другой формулировке:
1. Хедер должен быть защищён от повторного включения.
2. В хедер должны быть подключены все прочие, нужные для его компиляции (подключение одного хедера не должно требовать подключения другого)
3. Хедеры, требуемые для компиляции file.c, но не требуемые для file.h, следует подключать непосредственно в file.c, а не в file.h.

Пункт 3 я не писал, т.к. речь не о том и его нарушение не столь болезненно.

Бывают, конечно, исключения, но...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по подключению header
СообщениеДобавлено: 26 июл 2017, 21:27 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3532
aamonster писал(а):
B вашем примере по хорошему в print.h описаны только прототипы функций и константы, а LCD.h включается в print.c....

О том я и писал, что с головой надо подходить к связям, с головой :) Я специально привет тот пример, чтобы вы сами поняли результат. А нарисовали бы на бумажке сразу - еще быстрее бы увидели, куда что тянется

aamonster писал(а):
А рисовать на бумажке связи в такой ситуации - это беспредел. Не должно быть бумажной работы и подключения мозга там, где всё решается ...

Не хотите на бумажке - рисуйте на компе или планшете.
Подключением мозга тут не поможешь, в мозге всего не удержишь, тут еще программить как-то надо. Тем более во время обучения на простом бумажки помогают в дальнейшем.
А представьте себе проект хотябы из трех десятков файлов, да со сложной иерархией? Например, когда у вас графика, растровая да векторная, шрифты штуки три, декодер jpeg, тачскрин, софтовые кнопки и слайдеры, USB со своими дескрипторами и классами, sd-карта с файлами и файловой системой, да еще поверх этого РТОС прикручена, да как у нее там свои семафоры да мьютексы, да как еще процессов параллельных крутится... Вот уж в голове связи то удержать, так чтоб с катушек не спрыгнуть. Или валить всё в одну кучу, полагаясь на авось, что нигде ниче не завяжется?
Нет уж, благодарю, я уж лучше на бумажке, на бумажке, пусть это беспределом будет.

Про блокировку повторного включения - это само собой. Я эту блокировку ручками не прописываю, она у меня в шаблоне по умолчанию забита.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по подключению header
СообщениеДобавлено: 26 июл 2017, 21:52 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2614
Откуда: Санкт-Петербург
Да плевать мне на сложность проекта. Мне _не требуется_ строить граф связей между хедерами. Как только понадобилось - значит, что-то сломано.
Мне, знаете ли, приходится работать с проектами не на три десятка файлов, и делать лишнюю работу я не хочу.

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

Ну и да, всё, что можно, уносится из хидеров, чтобы уменьшить количество связей. Но для этого опять же не надо отслеживать граф взаимосвязей: просто читаешь список include и стираешь или переносишь в c-файл. Смотришь _один_ файл одновременно, не всю пачку.

Можно сформулировать иначе: все связи между хидерами должны быть явными. В форме #include, а не "не забудьте подключить first.h перед second.h".
Отказ от этого правила _ничего_ не даёт (а следование ему - позволяет, помимо всего прочего, на халяву получить ваш граф взаимосвязей между хидерами, прочитав только includes)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по подключению header
СообщениеДобавлено: 26 июл 2017, 23:13 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3532
ммм.. вон чо там у вас.. ну плевать так плевать. Дай бох, чтобы вам не попадались проекты по десять уровней вложенности. А то с таким подходом - это все равно что писать всё в одном файле main.c.
Кстати, хидер (хЭдер, хЕАдер, header - dosicus_2 - :) :) ) сам по себе в объектный файл не компилируется. А взаимосвязи хЕАдеров друг с другом - ничего не дают. Это не объекты. И никакого графа по ним не построишь. Хидеры - это интерфейсы исполняемых сишных файлов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по подключению header
СообщениеДобавлено: 26 июл 2017, 23:41 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5616
А если еще учесть, что модуль может быть не только исходником (*.с) но и ужО скомпилированной либой, да и вспомнить что суть хэдера - заголовок к модулю...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по подключению header
СообщениеДобавлено: 27 июл 2017, 00:24 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2614
Откуда: Санкт-Петербург
Ну, поленился я объяснять, что означает "компилируется" в приложении к хидеру. Понятно, что компилируем мы его не сам по себе, а включив в c-файл. Ну так вот надо, чтобы подключение хидера не ломало компиляцию.

А "плевать" - в том плане, что у меня _уже_ достаточно большие/сложные проекты (ну, не эмбеддер я - и привык к такому), и если у меня при подключении хидера проект перестанет собираться - я поправлю хидер и приду к его автору с претензией.
Я не буду строить глобальную иерархию этих хидеров - у меня на это нет ни времени, ни достаточно большого листа бумаги. Я просто буду писать каждый из них правильно.
А правильно - это так, чтобы читая один файл, мне по возможности не приходилось заглядывать в другие. Как я уже сказал, проекты большие.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по подключению header
СообщениеДобавлено: 27 июл 2017, 00:35 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3532
ммм... разумеется большие :) кто ж спорит :) да да, большие-большие, как звезды. Пятого размера :)
Ваапсчета, строится не "глобальная иерархия хидеров", а иерархия проекта. Иначе это не проект, а так, навал в навал. Да ладно вам, будете еще мне рассказывать, как у вас космические корабли большой театр бороздят :) мы, знаете ли, и сами с усами, не хуже вашего, плавали, знаем. Нынче в эмбедде собираются проекты ничуть не меньших размеров.

А кстате, чой-то "неэмбеддеры" то до сих пор на Сях сидять то? Тюююю...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по подключению header
СообщениеДобавлено: 27 июл 2017, 00:43 
Старожил

Зарегистрирован: 22 июн 2010, 21:53
Сообщения: 1023
Откуда: Brussels
BusMaster писал(а):
Дай бох, чтобы вам не попадались проекты по десять уровней вложенности.

Простите о каких уровнях вложенности идет речь?

Ни компилятор, ни линкер ничего о таких уровнях вложенности не слышали - у них ровно один уровень тот самый .с (.cpp) который сейчас компилируется и затем линкуется в итоговый код. Прилинковываться может уже готовый объектник (в виде .о или другого формата) взятый извне. Где тут есть место уровням вложенности?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по подключению header
СообщениеДобавлено: 27 июл 2017, 00:51 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 988
BusMaster писал(а):
Кстати, хидер (хЭдер, хЕАдер, header - dosicus_2 - :) :) )

Head - это голова, думаю никто это слово не читает как "хид", потому есть относительно устоявшее произношение "хедер", кстати, встроенная проверка правописания в моем браузере принимает только такой вариант, и есть более близкое к реальному звучанию "хэдер", но ТС как с хидера начал, так потом 4 человека за ним и повторило :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по подключению header
СообщениеДобавлено: 27 июл 2017, 01:01 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2614
Откуда: Санкт-Петербург
"Неэмбеддеры" в моём лице сидят на крестиках (впитавших родовые болезни си в виде отсутствия нормального механизма подключения модулей). И ещё на куче всякой дряни, включая javascript, который вроде как охренителен (простота и элегантность всей этой конструкции с prototype-based OO внушает), а с другой - после него крестики кажутся раем на земле хотя бы в силу наличия статической типизации. Уйти целиком на какой-нибудь C# (или, напротив, Swift) не даёт страшное слово "кроссплатформенность".

Reflector, похоже, что так. Я на протяжении треда просто старался писать слово одинаково, а почему в первый раз написал через "и" - уже не помню, скорее всего, действительно подстроился под первый пост.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по подключению header
СообщениеДобавлено: 27 июл 2017, 01:14 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3532
//Mt писал(а):
BusMaster писал(а):
Дай бох, чтобы вам не попадались проекты по десять уровней вложенности.

Простите о каких уровнях вложенности идет речь?

Уровень вложенности в данном контексте = уровень абстракции. Не компилятора или линкера.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по подключению header
СообщениеДобавлено: 27 июл 2017, 01:22 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2614
Откуда: Санкт-Петербург
Мы куда-то от headers совсем далеко ушли...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по подключению header
СообщениеДобавлено: 27 июл 2017, 01:29 
Старожил

Зарегистрирован: 22 июн 2010, 21:53
Сообщения: 1023
Откуда: Brussels
BusMaster писал(а):
Уровень вложенности в данном контексте = уровень абстракции. Не компилятора или линкера.

Абстракции чего?

Если речь идет о размещении файликов по структуре директорий - так, еще раз, компилятору всё равно. Программистам, конечно, удобно иметь определенный порядок в своих файлах (директории, репозитории и т.п.).

Но мы говорили об подключении хедеров - и тут наши абстракции наталкиваются на прозу использования препроцессора. И соблюдение простых правил, о которых тут уже писали, позволяет не тратить свое время на анализ последовательности директив #include для подключения конкретного модуля. Если вы подключили хедер и получили ошибку компиляции - хедер в рефакторинг. Если вы "подключили" "модули" А и Б и, внезапно, выяснилось, что можно подключать только сначала Б потом А, потому что для А не хватает каких то определений из Б - модули говно и должны уйти в рефакторинг.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по подключению header
СообщениеДобавлено: 27 июл 2017, 01:36 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3532
Чего чего... Кода, конечно.
Я ж говорю - голова должна быть на месте, а не бездумно тыкать. Вот хорошо будет, когда вы на верхние уровни вытащите грязь с низов, и эта грязь с низов натолкнется друг на друга.
Ой, да кароче, я уже объяснял, че повторять то.

:) ладно, я тут на даче сижу, а уже на воздухе комарики кусають, пойду спать. Доброй всем...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 26 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB