| Форум РадиоКот https://radiokot.ru/forum/ |
|
| Правильное подключение #include https://radiokot.ru/forum/viewtopic.php?f=57&t=181901 |
Страница 1 из 2 |
| Автор: | Land [ Ср мар 23, 2022 12:03:00 ] |
| Заголовок сообщения: | Правильное подключение #include |
Собственно столкнулся я с тем, что не могу разобраться в подключении #include. Собственно вопрос: а как их подключать, чтобы было правильно, если в проекте несколько файлов .c и соответствующих им .h ? Например у меня есть два файла .с, функции в которых используют _delay_ms(). Надо ли в каждом из них указать #include "delay.h" и определить F_CPU ? Или это делать в заголовочных файлах .h через #ifndef ? Или достаточно в файле main.c их просто всех перечислить, а компилятор сам разберется, куда и что подсунуть? avr-gss имеется в виду. |
|
| Автор: | COKPOWEHEU [ Ср мар 23, 2022 12:51:15 ] |
| Заголовок сообщения: | Re: Правильное подключение #include |
Цитата: Например у меня есть два файла .с, функции в которых используют _delay_ms(). Надо ли в каждом из них указать #include "delay.h" Да.Цитата: и определить F_CPU Нет. Это делается в настройках проекта или makefile ключом -DF_CPU
|
|
| Автор: | Land [ Ср мар 23, 2022 13:16:04 ] |
| Заголовок сообщения: | Re: Правильное подключение #include |
Таким образом получается, что если у меня есть файл 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 |
|
| Автор: | Martian [ Ср мар 23, 2022 13:21:15 ] |
| Заголовок сообщения: | Re: Правильное подключение #include |
Вам придётся прописать его везде, где используется функция. В этом случае может возникнуть другая ошибка: два и более определений функций. В этом случае как раз используют директивы #ifndef в начале файла .h - тогда при сборке, если уже один раз было собрано, последующие попытки проигнорируются. |
|
| Автор: | Land [ Ср мар 23, 2022 14:47:18 ] |
| Заголовок сообщения: | Re: Правильное подключение #include |
. В этом случае как раз используют директивы #ifndef в начале файла .h - тогда при сборке, если уже один раз было собрано, последующие попытки проигнорируются. А с переменными тоже так же надо? А то у меня одна переменная должна в двух разных файлах использоваться (результаты из функции в одном файле используются в функции в другом файле. И вот как-то не получается у меня одну переменную к двум файлам привязать. И объявляю вроде как глобальную, т.е. вне функции и volatile использую. Но компилятор не соглашается с моим предложением Нет, так тоже не получается |
|
| Автор: | GoldenAndy [ Ср мар 23, 2022 15:49:16 ] |
| Заголовок сообщения: | Re: Правильное подключение #include |
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 и подключать его везде, где надо. |
|
| Автор: | COKPOWEHEU [ Ср мар 23, 2022 17:07:52 ] |
| Заголовок сообщения: | Re: Правильное подключение #include |
Цитата: Таким образом получается, что если у меня есть файл 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 Можно и так, хотя мне привязка к порядку инклюдов не нравится. |
|
| Автор: | Land [ Ср мар 23, 2022 21:48:15 ] |
| Заголовок сообщения: | Re: Правильное подключение #include |
Большое вам спасибо. Наконец-то пазл сложился, а то кусок оттуда, кусок отсюда, а цельной картины не было. Еще раз большое спасибо за разъяснения ) |
|
| Автор: | GoldenAndy [ Ср мар 23, 2022 22:57:34 ] |
| Заголовок сообщения: | Re: Правильное подключение #include |
COKPOWEHEU писал(а): Можно и так, хотя мне привязка к порядку инклюдов не нравится. Да мне тоже. Но в случае delay.h - или прописывать в свойствах проекта, или прописывать в ключах, или следить за порядком инклюдов.Хотя я этот делей использую редко, в основном у меня суперцикл, привязанный к системному таймеру, и все задержки считаются от системного таймера. А, и я считаю, что проще прописать или в свойствах проекта, или в инклюднике, нежели бегать по строкам конфига флагов компилятора. Да, я понимаю, что то, что я пропишу в свойствах проекта - тоже попадет в те же флаги компилятора. Хотя в свойствах проекта - более наглядно. Но есть любители собирать проекты руками, писать make в блокнотике, в соседнем блокнотике исходник, компилить из командной строки, прошивать дудкой, делая ей свой батник.... Мне проще всё прописать в свойствах проекта, написать текст в студии, нажать F11 и получить прошивку уже в МК. |
|
| Автор: | ARV [ Чт мар 24, 2022 07:52:20 ] |
| Заголовок сообщения: | Re: Правильное подключение #include |
встречал не раз подход, когда все подряд h-файлы списком перечисляются в некоем config.h, а потом только этот единственный config.h инклюдится во всех подряд исходниках - типа, коротко и ясно. не могу одобрить такой подход, поскольку главный смысл h-файлов и их включения - хоть как-то ограничить область видимости сущностей, в них описанных. сваливание всего в кучу де-факто аннулирует даже намек на это. хорошая практика: в каждом с-файле внутри подключаются те и только те h-файлы, которые необходимы для компиляции только этого сишного файла, а в отдельном h-файле с тем же именем, что и сишный, описываются те функции и переменные, которые могут понадобиться другим файлам проекта. |
|
| Автор: | GoldenAndy [ Чт мар 24, 2022 11:00:51 ] |
| Заголовок сообщения: | Re: Правильное подключение #include |
ARV, правильно. но иногда получается, что для какого то стороннего h-файла нужен некий дефайн. (см. delay.h и F_CPU) И тут или этот дефайн лепить в каждом с-файле, дабы его увидел delay.h, или делать отдельный заголовочник для общих определений, или писать в свойства проекта / ключи компилятора. Мне лично удобнее выносить в отдельный общий инклюдник. Там у меня вагон всего общего живет. |
|
| Автор: | ARV [ Чт мар 24, 2022 11:07:11 ] |
| Заголовок сообщения: | Re: Правильное подключение #include |
GoldenAndy писал(а): но иногда получается, что для какого то стороннего h-файла нужен некий дефайн. (см. delay.h и F_CPU) из вашего перечисления только последний вариант правильный - общие для всего проекта константы, дефайны и т.п. следует выносить в опции проекта/компилятора, и никак ниначе.И тут или этот дефайн лепить в каждом с-файле, дабы его увидел delay.h, или делать отдельный заголовочник для общих определений, или писать в свойства проекта / ключи компилятора то есть это не абсолютное требование, но универсально-правильное. |
|
| Автор: | GoldenAndy [ Чт мар 24, 2022 11:19:13 ] |
| Заголовок сообщения: | Re: Правильное подключение #include |
ARV, я не любитель руками править всякие ключи компилятора, редактировать make и прочее... Меня, в принципе, устраивает вынести общий для всех-всех модулей дефайн в конфиг в студии. Но мне удобнее и проще определить этот дефайн в общем инклюднике. Там же и другие общие константы/дефайны, typedef-ы и т.д. Кроме того, когда всё в инклюднике - проще выкладывать исходники. *.c и *.h выложил - и всё. А дальше каждый может попробовать затянуть в свою любимую ide. Но тут на вкус и цвет - фломастеры разные. И да, я ж не программист, я только учусь. 33 года уже учусь. |
|
| Автор: | ARV [ Чт мар 24, 2022 11:32:31 ] |
| Заголовок сообщения: | Re: Правильное подключение #include |
да я не против... я всегда придерживаюсь правила, что веревку достаточной длины, чтобы выстрелить себе в ногу, каждый волен выбирать сам. только ваш подход чреват тем, что собирая новый проект из "отработанных и гарантированно работающих" старых файлов, вы рискуете в одном из них забыть про какой-то дефайн, и получить чудеса... а так - снова, как я не раз говорил: все полезно, что в рот полезло. Добавлено after 1 minute 12 seconds: GoldenAndy писал(а): я ж не программист, я только учусь. 33 года уже учусь я и сам такой... учусь только дольше - тупой, наверное...
|
|
| Автор: | Land [ Чт мар 24, 2022 14:12:21 ] |
| Заголовок сообщения: | Re: Правильное подключение #include |
А почему #define NAME из одного .с файла не определено для другого? И как с этим бороться? Делать глобальный .с файл, в который вносить подобные дефайны? |
|
| Автор: | COKPOWEHEU [ Чт мар 24, 2022 14:14:38 ] |
| Заголовок сообщения: | Re: Правильное подключение #include |
Потому что #define это просто вставка всего текста из одного файла в другой. Цитата: Делать глобальный .с файл, в который вносить подобные дефайны? Чего вы хотите добиться этим я вообще не знаю.
|
|
| Автор: | JMC.Hard [ Чт мар 24, 2022 16:05:51 ] |
| Заголовок сообщения: | Re: Правильное подключение #include |
А почему #define NAME из одного .с файла не определено для другого? И как с этим бороться? А для этого, Land, в языках программирования существует такое понятие, как область видимости. Покопайте в эту сторону |
|
| Автор: | Land [ Чт мар 24, 2022 21:52:04 ] |
| Заголовок сообщения: | Re: Правильное подключение #include |
Чего вы хотите добиться этим я вообще не знаю. не прописывать одни и те же дефайны по пять раз в разных файлах. Вроде как очевидно Добавлено after 30 seconds: А почему #define NAME из одного .с файла не определено для другого? И как с этим бороться? А для этого, Land, в языках программирования существует такое понятие, как область видимости. Покопайте в эту сторону спасибо. |
|
| Автор: | COKPOWEHEU [ Чт мар 24, 2022 23:28:53 ] |
| Заголовок сообщения: | Re: Правильное подключение #include |
Цитата: не прописывать одни и те же дефайны по пять раз в разных файлах. Вроде как очевидно Что плохого в том, что в каждом файле прописывается именно то, что в нем нужно, а не абы что? |
|
| Автор: | Martian [ Пт мар 25, 2022 00:08:08 ] |
| Заголовок сообщения: | Re: Правильное подключение #include |
Ну, если значение одного и того же дефайна должно быть одним и тем же для всех файлов, где он используется, то как-то странно его прописывать сколько-то раз. В конце концов, если его потом надо изменить, где-то забудется и приведёт к ошибке. |
|
| Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|


