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

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

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

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

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

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

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы
Непрочитано 26.03.2015, 10:37  
zepto
Прохожий
 
Регистрация: 26.03.2015
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
zepto на пути к лучшему
По умолчанию Квалификатор 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, даже несмотря на то что они там не объявлены.
Я правильно рассуждаю?
Реклама:
zepto вне форума  
Непрочитано 26.03.2015, 10:55  
Wiza_
Почётный гражданин KAZUS.RU
 
Регистрация: 29.12.2012
Адрес: Питер
Сообщений: 982
Сказал спасибо: 131
Сказали Спасибо 230 раз(а) в 157 сообщении(ях)
Wiza_ на пути к лучшему
По умолчанию Re: Квалификатор extern

http://www.c-cpp.ru/books/extern
Wiza_ вне форума  
Непрочитано 26.03.2015, 11:00  
Wiza_
Почётный гражданин KAZUS.RU
 
Регистрация: 29.12.2012
Адрес: Питер
Сообщений: 982
Сказал спасибо: 131
Сказали Спасибо 230 раз(а) в 157 сообщении(ях)
Wiza_ на пути к лучшему
По умолчанию Re: Квалификатор extern

Сообщение от zepto Посмотреть сообщение
Вопрос: Я правильно понимаю, что все эти объявления, константы и прочее, желательно размещать именно в заголовочных файлах только для того, что бы не "захламлять" .с файлы?
В C++ *.c не подключится к проекту без соответствующего *.h
Wiza_ вне форума  
Непрочитано 26.03.2015, 12:15  
MisterDi
Почётный гражданин KAZUS.RU
 
Аватар для MisterDi
 
Регистрация: 13.02.2008
Адрес: Днепр. Украина
Сообщений: 3,294
Сказал спасибо: 442
Сказали Спасибо 1,048 раз(а) в 706 сообщении(ях)
MisterDi на пути к лучшему
По умолчанию Re: Квалификатор extern

Квалификатор extern указывает компилятору на то, что адрес функции будет определен на этапе сборки а не на этапе компиляции. Т.е в памяти программы резервируется место для адреса и в таблице перекрестных ссылок создается элемент внешней ссылки.
__________________
misterdi<@>i.ua
MisterDi вне форума  
Непрочитано 26.03.2015, 12:25  
zepto
Прохожий
 
Регистрация: 26.03.2015
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
zepto на пути к лучшему
По умолчанию Re: Квалификатор extern

Сообщение от Wiza_ Посмотреть сообщение
В C++ *.c не подключится к проекту без соответствующего *.h
Кстати, а вот в этом видеоуроке youtube.com Александр Писанец автор и вовсе предлагает создавать библиотеку прямо в заголовочном файле, без использования .с файла. Неужели так можно делать?
Самое интересное, что Atmel Studio никаких замечаний при компиляции, по поводу размещения кода прямо в .h файле, не делает!
zepto вне форума  
Непрочитано 26.03.2015, 12:30  
zepto
Прохожий
 
Регистрация: 26.03.2015
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
zepto на пути к лучшему
По умолчанию Re: Квалификатор extern

Сообщение от MisterDi Посмотреть сообщение
Квалификатор extern указывает компилятору на то, что адрес функции будет определен на этапе сборки а не на этапе компиляции. Т.е в памяти программы резервируется место для адреса и в таблице перекрестных ссылок создается элемент внешней ссылки.
Это все уже детали.
Но, я правильно понимаю, что основное назначение extern - это создание переменных и функций, которые можно использовать в других файлах того же проекта?
zepto вне форума  
Непрочитано 26.03.2015, 12:34  
zepto
Прохожий
 
Регистрация: 26.03.2015
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
zepto на пути к лучшему
По умолчанию Re: Квалификатор extern

И так никто пока и не пояснил, зачем иногда прописывают функции и переменные в .с файле с квалификатором extern?
Или, когда прописывают в .h файле переменные и функции с extern, но при этом нигде в других файлах не используют.
Это ошибка, невнимательность или все-таки несет какой-то скрытый смысл?
zepto вне форума  
Непрочитано 26.03.2015, 12:40  
Bill
Гражданин KAZUS.RU
 
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 341 раз(а) в 202 сообщении(ях)
Bill на пути к лучшему
По умолчанию Re: Квалификатор extern

Сообщение от zepto Посмотреть сообщение
Кстати, а вот в этом видеоуроке youtube.com Александр Писанец автор и вовсе предлагает создавать библиотеку прямо в заголовочном файле, без использования .с файла. Неужели так можно делать?
Самое интересное, что Atmel Studio никаких замечаний при компиляции, по поводу размещения кода прямо в .h файле, не делает!
Делать то-то можно, только ... Размещать исполняемый код в заголовочном файле считается дурным тоном. И потом, что что автор называет библиотекой, на самом деле таковой не является. Это просто куски кода, собранные в одном файле. Если вы хотите действительно разобраться в этих вопросах, почитайте книги по системному программированию.
Bill вне форума  
Непрочитано 26.03.2015, 12:45  
akegor
Гуру портала
 
Аватар для akegor
 
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,924
Сказал спасибо: 2,543
Сказали Спасибо 11,821 раз(а) в 5,927 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: Квалификатор extern

Сообщение от zepto Посмотреть сообщение
основное назначение extern - это создание
Экстерн не создает, а говорит, что надо искать созданное в другом месте.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.

Последний раз редактировалось akegor; 26.03.2015 в 13:19.
akegor вне форума  
Непрочитано 26.03.2015, 13:16  
_Артём_
Гражданин KAZUS.RU
 
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
_Артём_ на пути к лучшему
По умолчанию Re: Квалификатор extern

Сообщение от Wiza_ Посмотреть сообщение
В C++ *.c не подключится к проекту без соответствующего *.h
Что за бред?
Подключится.
_Артём_ вне форума  
 

Закладки

Метки
avr-gcc, extern, язык си
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пара непонятных моментов по языку СИ kvark85 Embedd С 102 17.05.2013 23:43
struct & union в многофайловом проекте. picavr Микроконтроллеры, АЦП, память и т.д 20 25.02.2010 13:44


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


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