Например TDA7294

Форум РадиоКот • Просмотр темы - Правильное подключение #include
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Пн июл 28, 2025 02:05:23

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


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 30 ]  1,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Правильное подключение #include
СообщениеДобавлено: Ср мар 23, 2022 12:03:00 
Прорезались зубы

Карма: -5
Рейтинг сообщений: -18
Зарегистрирован: Ср янв 11, 2012 11:55:51
Сообщений: 216
Рейтинг сообщения: 0
Собственно столкнулся я с тем, что не могу разобраться в подключении #include. Собственно вопрос: а как их подключать, чтобы было правильно, если в проекте несколько файлов .c и соответствующих им .h ? Например у меня есть два файла .с, функции в которых используют _delay_ms(). Надо ли в каждом из них указать #include "delay.h" и определить F_CPU ? Или это делать в заголовочных файлах .h через #ifndef ? Или достаточно в файле main.c их просто всех перечислить, а компилятор сам разберется, куда и что подсунуть? avr-gss имеется в виду.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Правильное подключение #include
СообщениеДобавлено: Ср мар 23, 2022 12:51:15 
Говорящий с текстолитом
Аватар пользователя

Карма: 8
Рейтинг сообщений: 209
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1520
Рейтинг сообщения: 0
Цитата:
Например у меня есть два файла .с, функции в которых используют _delay_ms(). Надо ли в каждом из них указать #include "delay.h"
Да.
Цитата:
и определить F_CPU
Нет. Это делается в настройках проекта или makefile ключом -DF_CPU


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Правильное подключение #include
СообщениеДобавлено: Ср мар 23, 2022 13:16:04 
Прорезались зубы

Карма: -5
Рейтинг сообщений: -18
Зарегистрирован: Ср янв 11, 2012 11:55:51
Сообщений: 216
Рейтинг сообщения: 0
Таким образом получается, что если у меня есть файл lcd.h в котором определена функция lcd_str_out(), и этот файл подключен #include lcd.h в файле main.c и я захочу использовать эту функцию в файле ADC.c, то мне надо будет и в нем прописать #include lcd.h и все include, которые может потребовать эта lcd.h. Правильно? Ну либо перенести использование этой функции из ADC.c в main.c

Добавлено after 1 minute 15 seconds:
Нет. Это делается в настройках проекта или makefile ключом -DF_CPU

Atmel Studio не просит в свойствах проекта частоту CPU :(


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Правильное подключение #include
СообщениеДобавлено: Ср мар 23, 2022 13:21:15 
Друг Кота

Карма: 68
Рейтинг сообщений: 1961
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 12867
Рейтинг сообщения: 0
Вам придётся прописать его везде, где используется функция. В этом случае может возникнуть другая ошибка: два и более определений функций. В этом случае как раз используют директивы #ifndef в начале файла .h - тогда при сборке, если уже один раз было собрано, последующие попытки проигнорируются.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Правильное подключение #include
СообщениеДобавлено: Ср мар 23, 2022 14:47:18 
Прорезались зубы

Карма: -5
Рейтинг сообщений: -18
Зарегистрирован: Ср янв 11, 2012 11:55:51
Сообщений: 216
Рейтинг сообщения: 0
. В этом случае как раз используют директивы #ifndef в начале файла .h - тогда при сборке, если уже один раз было собрано, последующие попытки проигнорируются.

А с переменными тоже так же надо? А то у меня одна переменная должна в двух разных файлах использоваться (результаты из функции в одном файле используются в функции в другом файле. И вот как-то не получается у меня одну переменную к двум файлам привязать. И объявляю вроде как глобальную, т.е. вне функции и volatile использую. Но компилятор не соглашается с моим предложением :))
Нет, так тоже не получается :cry:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Правильное подключение #include
СообщениеДобавлено: Ср мар 23, 2022 15:49:16 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 66
Рейтинг сообщений: 536
Зарегистрирован: Чт июл 28, 2016 07:58:37
Сообщений: 1925
Откуда: Kyiv, UA
Рейтинг сообщения: 0
Land, по F_CPU
Сделайте отдельный заголовочный файл, например, defines.h
В нем определите этот F_CPU и подключайте этот файл во всех ваших файлах, где вы подключаете delay.h
Подключать defines.h нужно перед delay.h

По переменной.
Объявляете эту переменную в одном модуле.
пусть это
unsigned int i;

тогда в нужном вам другом модуле пишете
extern unsigned int i;
и компилятор понимает, что i у нас уже где то есть и не делает еще одну переменную.
Можно все глобальные переменные объявить в main.c, а extern-нотификации описать в том же defines.h и подключать его везде, где надо.

_________________
ИзображениеИзображение
Изображение
 
Telegram               Лучшая благодарность ->
[+]


Вернуться наверх
 
Распродажа паяльного оборудования ATTEN!
Паяльные станции, паяльники и аксессуары по самой выгодной цене.

По промокоду radiokot скидка 10%
Не в сети
 Заголовок сообщения: Re: Правильное подключение #include
СообщениеДобавлено: Ср мар 23, 2022 17:07:52 
Говорящий с текстолитом
Аватар пользователя

Карма: 8
Рейтинг сообщений: 209
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1520
Рейтинг сообщения: 0
Цитата:
Таким образом получается, что если у меня есть файл lcd.h в котором определена функция lcd_str_out(), и этот файл подключен #include lcd.h в файле main.c и я захочу использовать эту функцию в файле ADC.c, то мне надо будет и в нем прописать #include lcd.h и все include, которые может потребовать эта lcd.h. Правильно?
Да. Но если у вас и сам код функции тоже в *.h файле - будут проблемы. Тогда либо не использовать эти функции откуда попало, а только из одного *.c файла, либо разделять библиотеку по-человечески на *.c + *.h.
Цитата:
Atmel Studio не просит в свойствах проекта частоту CPU
Ну так пропишите -DF_CPU=... во флаги компилятора руками, возможность вписывать свои флаги там есть
Цитата:
В этом случае как раз используют директивы #ifndef в начале файла .h - тогда при сборке, если уже один раз было собрано, последующие попытки проигнорируются.
Это от многократного включения в ОДИН *.c файл. Если же включаются в разные *.c файлы, это не поможет.
Цитата:
А с переменными тоже так же надо? А то у меня одна переменная должна в двух разных файлах использоваться (результаты из функции в одном файле используются в функции в другом файле.
В *.c файле переменную определяете, а в *.h - объявляете с модификатором extern. Он говорит, что переменная где-то есть, но не тут.
Цитата:
Сделайте отдельный заголовочный файл, например, defines.h
В нем определите этот F_CPU и подключайте этот файл во всех ваших файлах, где вы подключаете delay.h
Подключать defines.h нужно перед delay.h

Можно и так, хотя мне привязка к порядку инклюдов не нравится.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Правильное подключение #include
СообщениеДобавлено: Ср мар 23, 2022 21:48:15 
Прорезались зубы

Карма: -5
Рейтинг сообщений: -18
Зарегистрирован: Ср янв 11, 2012 11:55:51
Сообщений: 216
Рейтинг сообщения: 0
Большое вам спасибо. Наконец-то пазл сложился, а то кусок оттуда, кусок отсюда, а цельной картины не было. Еще раз большое спасибо за разъяснения )


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Правильное подключение #include
СообщениеДобавлено: Ср мар 23, 2022 22:57:34 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 66
Рейтинг сообщений: 536
Зарегистрирован: Чт июл 28, 2016 07:58:37
Сообщений: 1925
Откуда: Kyiv, UA
Рейтинг сообщения: 0
COKPOWEHEU писал(а):
Можно и так, хотя мне привязка к порядку инклюдов не нравится.
Да мне тоже. Но в случае delay.h - или прописывать в свойствах проекта, или прописывать в ключах, или следить за порядком инклюдов.
Хотя я этот делей использую редко, в основном у меня суперцикл, привязанный к системному таймеру, и все задержки считаются от системного таймера.

А, и я считаю, что проще прописать или в свойствах проекта, или в инклюднике, нежели бегать по строкам конфига флагов компилятора.
Да, я понимаю, что то, что я пропишу в свойствах проекта - тоже попадет в те же флаги компилятора.
Хотя в свойствах проекта - более наглядно.
Но есть любители собирать проекты руками, писать make в блокнотике, в соседнем блокнотике исходник, компилить из командной строки, прошивать дудкой, делая ей свой батник....
Мне проще всё прописать в свойствах проекта, написать текст в студии, нажать F11 и получить прошивку уже в МК.

_________________
ИзображениеИзображение
Изображение
 
Telegram               Лучшая благодарность ->
[+]


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Правильное подключение #include
СообщениеДобавлено: Чт мар 24, 2022 07:52:20 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2116
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18403
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
встречал не раз подход, когда все подряд h-файлы списком перечисляются в некоем config.h, а потом только этот единственный config.h инклюдится во всех подряд исходниках - типа, коротко и ясно. не могу одобрить такой подход, поскольку главный смысл h-файлов и их включения - хоть как-то ограничить область видимости сущностей, в них описанных. сваливание всего в кучу де-факто аннулирует даже намек на это.

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

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Правильное подключение #include
СообщениеДобавлено: Чт мар 24, 2022 11:00:51 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 66
Рейтинг сообщений: 536
Зарегистрирован: Чт июл 28, 2016 07:58:37
Сообщений: 1925
Откуда: Kyiv, UA
Рейтинг сообщения: 0
ARV, правильно. но иногда получается, что для какого то стороннего h-файла нужен некий дефайн. (см. delay.h и F_CPU)
И тут или этот дефайн лепить в каждом с-файле, дабы его увидел delay.h, или делать отдельный заголовочник для общих определений, или писать в свойства проекта / ключи компилятора.
Мне лично удобнее выносить в отдельный общий инклюдник.
Там у меня вагон всего общего живет.

_________________
ИзображениеИзображение
Изображение
 
Telegram               Лучшая благодарность ->
[+]


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Правильное подключение #include
СообщениеДобавлено: Чт мар 24, 2022 11:07:11 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2116
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18403
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
GoldenAndy писал(а):
но иногда получается, что для какого то стороннего h-файла нужен некий дефайн. (см. delay.h и F_CPU)
И тут или этот дефайн лепить в каждом с-файле, дабы его увидел delay.h, или делать отдельный заголовочник для общих определений, или писать в свойства проекта / ключи компилятора
из вашего перечисления только последний вариант правильный - общие для всего проекта константы, дефайны и т.п. следует выносить в опции проекта/компилятора, и никак ниначе.

то есть это не абсолютное требование, но универсально-правильное.

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Правильное подключение #include
СообщениеДобавлено: Чт мар 24, 2022 11:19:13 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 66
Рейтинг сообщений: 536
Зарегистрирован: Чт июл 28, 2016 07:58:37
Сообщений: 1925
Откуда: Kyiv, UA
Рейтинг сообщения: 0
ARV, я не любитель руками править всякие ключи компилятора, редактировать make и прочее...
Меня, в принципе, устраивает вынести общий для всех-всех модулей дефайн в конфиг в студии.
Но мне удобнее и проще определить этот дефайн в общем инклюднике.
Там же и другие общие константы/дефайны, typedef-ы и т.д.
Кроме того, когда всё в инклюднике - проще выкладывать исходники. *.c и *.h выложил - и всё. А дальше каждый может попробовать затянуть в свою любимую ide.
Но тут на вкус и цвет - фломастеры разные.

И да, я ж не программист, я только учусь. 33 года уже учусь.

_________________
ИзображениеИзображение
Изображение
 
Telegram               Лучшая благодарность ->
[+]


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Правильное подключение #include
СообщениеДобавлено: Чт мар 24, 2022 11:32:31 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2116
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18403
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
да я не против... я всегда придерживаюсь правила, что веревку достаточной длины, чтобы выстрелить себе в ногу, каждый волен выбирать сам.

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

Добавлено after 1 minute 12 seconds:
GoldenAndy писал(а):
я ж не программист, я только учусь. 33 года уже учусь
я и сам такой... учусь только дольше - тупой, наверное...

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Правильное подключение #include
СообщениеДобавлено: Чт мар 24, 2022 14:12:21 
Прорезались зубы

Карма: -5
Рейтинг сообщений: -18
Зарегистрирован: Ср янв 11, 2012 11:55:51
Сообщений: 216
Рейтинг сообщения: 0
А почему #define NAME из одного .с файла не определено для другого? И как с этим бороться? Делать глобальный .с файл, в который вносить подобные дефайны?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Правильное подключение #include
СообщениеДобавлено: Чт мар 24, 2022 14:14:38 
Говорящий с текстолитом
Аватар пользователя

Карма: 8
Рейтинг сообщений: 209
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1520
Рейтинг сообщения: 0
Потому что #define это просто вставка всего текста из одного файла в другой.
Цитата:
Делать глобальный .с файл, в который вносить подобные дефайны?
Чего вы хотите добиться этим я вообще не знаю.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Правильное подключение #include
СообщениеДобавлено: Чт мар 24, 2022 16:05:51 
Мучитель микросхем
Аватар пользователя

Карма: 7
Рейтинг сообщений: 100
Зарегистрирован: Ср сен 16, 2020 20:38:41
Сообщений: 413
Откуда: Краснодарский край, г.Абинск
Рейтинг сообщения: 0
А почему #define NAME из одного .с файла не определено для другого? И как с этим бороться?

А для этого, Land, в языках программирования существует такое понятие, как область видимости. Покопайте в эту сторону :wink:

_________________
Лучше сделать и жалеть, чем жалеть, что не сделал ...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Правильное подключение #include
СообщениеДобавлено: Чт мар 24, 2022 21:52:04 
Прорезались зубы

Карма: -5
Рейтинг сообщений: -18
Зарегистрирован: Ср янв 11, 2012 11:55:51
Сообщений: 216
Рейтинг сообщения: 0
Чего вы хотите добиться этим я вообще не знаю.

не прописывать одни и те же дефайны по пять раз в разных файлах. Вроде как очевидно

Добавлено after 30 seconds:
А почему #define NAME из одного .с файла не определено для другого? И как с этим бороться?

А для этого, Land, в языках программирования существует такое понятие, как область видимости. Покопайте в эту сторону :wink:

спасибо.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Правильное подключение #include
СообщениеДобавлено: Чт мар 24, 2022 23:28:53 
Говорящий с текстолитом
Аватар пользователя

Карма: 8
Рейтинг сообщений: 209
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1520
Рейтинг сообщения: 0
Цитата:
не прописывать одни и те же дефайны по пять раз в разных файлах. Вроде как очевидно

Что плохого в том, что в каждом файле прописывается именно то, что в нем нужно, а не абы что?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Правильное подключение #include
СообщениеДобавлено: Пт мар 25, 2022 00:08:08 
Друг Кота

Карма: 68
Рейтинг сообщений: 1961
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 12867
Рейтинг сообщения: 0
Ну, если значение одного и того же дефайна должно быть одним и тем же для всех файлов, где он используется, то как-то странно его прописывать сколько-то раз. В конце концов, если его потом надо изменить, где-то забудется и приведёт к ошибке.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 30 ]  1,  

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


Кто сейчас на форуме

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


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

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


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y