AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
26.03.2015, 10:37
|
|
Прохожий
Регистрация: 26.03.2015
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Квалификатор extern
Прошу совета по квалификатору extern.
Объясните, пожалуйста, как им правильно пользоваться!
Дело в том, что я примерно представляю, зачем он нужен и как его использовать. Но во многих программах для микроконтроллеров, написанных даже достаточно опытными программистами, то и дело встречаю бесконтрольное использование extern. А это очень сильно сбивает с толку.
Вот, к примеру, я несколько раз видел, что в .с файле (допустим, в signal.c) определяют переменную и функцию с extern и ту же самую переменную и функцию объявляют в .h файле (signal.h) И нигде в других файлах проекта эти переменные и функции больше не используют. Вот зачем так сделано?
Или вот еще пример:
В .с файле alarm.c определяют функцию и переменные с квалификатором extern:
extern uint8_t current_time;
extern volatile uint8_t status;
extern void init_alarms()
{
for(int =0;i‹sizeof(alarm_param)*ALARM_NUM;i++)
{ *(((uint8_t*)Alarms)+i) = EEPROM_read(i); }
}
в .h файле alarm.h зачем то пишут прототип функции с квалификатором extern:
extern void init_alarms();
В других файлах проекта используются переменные current_time и status.
Но зачем вообще надо было в .с файле alarm.c определять переменные с квалификатором extern?
А функция init_alarms() и вовсе больше нигде не используется. Так зачем она определена в alarm.c с квалификатором extern и ее прототип в alarm.h то же прописан с квалификатором extern?
-----
Теперь я скажу свое видение, как правильно использовать extern, а уважаемых участников форума прошу меня поправить, если я в чем-то ошибаюсь.
Допустим, в проекте используются вот такие два подключаемых модуля: DS1307.с и HD44780.c
К ним создаются соответствующие заголовочные файлы DS1307.h и HD44780.h, в которых прописаны объявления функций, константы и, к примеру, свои типы данных.
Вопрос: Я правильно понимаю, что все эти объявления, константы и прочее, желательно размещать именно в заголовочных файлах только для того, что бы не "захламлять" .с файлы?
Хотя, ведь вполне можно все это разместить и в с. файле и совсем не создавать заголовочный файл .h ?
Теперь, допустим, мне надо что бы переменная time и функция set_time(), которые определены в DS1307.с и объявлены в DS1307.h были доступны из файла HD44780.c.
А для этого, я в заголовочном файле HD44780.h объявляю переменную time и функцию set_time() с квалификатором extern:
extern uint8_t time;
extern uint8_t set_time(void);
То есть, таким образом, я даю понять линковщику, что бы он не искал переменную time и функцию set_time() в файле HD44780.c (потому что их там просто нет), а начинал искать в других файлах, подключенных в проект.
Линковщик ищет по всем файлам проекта переменную time и функцию set_time() и успешно находит их определения в DS1307.с И после этого, позволяет их использовать в файле HD44780.c, даже несмотря на то что они там не объявлены.
Я правильно рассуждаю?
|
|
|
|
26.03.2015, 10:55
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.12.2012
Адрес: Питер
Сообщений: 982
Сказал спасибо: 131
Сказали Спасибо 230 раз(а) в 157 сообщении(ях)
|
Re: Квалификатор extern
|
|
|
|
26.03.2015, 11:00
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.12.2012
Адрес: Питер
Сообщений: 982
Сказал спасибо: 131
Сказали Спасибо 230 раз(а) в 157 сообщении(ях)
|
Re: Квалификатор extern
Сообщение от zepto
|
Вопрос: Я правильно понимаю, что все эти объявления, константы и прочее, желательно размещать именно в заголовочных файлах только для того, что бы не "захламлять" .с файлы?
|
В C++ *.c не подключится к проекту без соответствующего *.h
|
|
|
|
26.03.2015, 12:15
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.02.2008
Адрес: Днепр. Украина
Сообщений: 3,294
Сказал спасибо: 442
Сказали Спасибо 1,048 раз(а) в 706 сообщении(ях)
|
Re: Квалификатор extern
Квалификатор extern указывает компилятору на то, что адрес функции будет определен на этапе сборки а не на этапе компиляции. Т.е в памяти программы резервируется место для адреса и в таблице перекрестных ссылок создается элемент внешней ссылки.
__________________
misterdi<@>i.ua
|
|
|
|
26.03.2015, 12:25
|
|
Прохожий
Регистрация: 26.03.2015
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Квалификатор extern
Сообщение от Wiza_
|
В C++ *.c не подключится к проекту без соответствующего *.h
|
Кстати, а вот в этом видеоуроке youtube.com Александр Писанец автор и вовсе предлагает создавать библиотеку прямо в заголовочном файле, без использования .с файла. Неужели так можно делать?
Самое интересное, что Atmel Studio никаких замечаний при компиляции, по поводу размещения кода прямо в .h файле, не делает!
|
|
|
|
26.03.2015, 12:30
|
|
Прохожий
Регистрация: 26.03.2015
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Квалификатор extern
Сообщение от MisterDi
|
Квалификатор extern указывает компилятору на то, что адрес функции будет определен на этапе сборки а не на этапе компиляции. Т.е в памяти программы резервируется место для адреса и в таблице перекрестных ссылок создается элемент внешней ссылки.
|
Это все уже детали.
Но, я правильно понимаю, что основное назначение extern - это создание переменных и функций, которые можно использовать в других файлах того же проекта?
|
|
|
|
26.03.2015, 12:34
|
|
Прохожий
Регистрация: 26.03.2015
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Квалификатор extern
И так никто пока и не пояснил, зачем иногда прописывают функции и переменные в .с файле с квалификатором extern?
Или, когда прописывают в .h файле переменные и функции с extern, но при этом нигде в других файлах не используют.
Это ошибка, невнимательность или все-таки несет какой-то скрытый смысл?
|
|
|
|
26.03.2015, 12:40
|
|
Гражданин KAZUS.RU
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 341 раз(а) в 202 сообщении(ях)
|
Re: Квалификатор extern
Сообщение от zepto
|
Кстати, а вот в этом видеоуроке youtube.com Александр Писанец автор и вовсе предлагает создавать библиотеку прямо в заголовочном файле, без использования .с файла. Неужели так можно делать?
Самое интересное, что Atmel Studio никаких замечаний при компиляции, по поводу размещения кода прямо в .h файле, не делает!
|
Делать то-то можно, только ... Размещать исполняемый код в заголовочном файле считается дурным тоном. И потом, что что автор называет библиотекой, на самом деле таковой не является. Это просто куски кода, собранные в одном файле. Если вы хотите действительно разобраться в этих вопросах, почитайте книги по системному программированию.
|
|
|
|
26.03.2015, 12:45
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,924
Сказал спасибо: 2,543
Сказали Спасибо 11,821 раз(а) в 5,927 сообщении(ях)
|
Re: Квалификатор extern
Сообщение от zepto
|
основное назначение extern - это создание
|
Экстерн не создает, а говорит, что надо искать созданное в другом месте.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
Последний раз редактировалось akegor; 26.03.2015 в 13:19.
|
|
|
|
26.03.2015, 13:16
|
|
Гражданин KAZUS.RU
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
|
Re: Квалификатор extern
Сообщение от Wiza_
|
В C++ *.c не подключится к проекту без соответствующего *.h
|
Что за бред?
Подключится.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:24.
|
|