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

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

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

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

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

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

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

 
Опции темы

Квалификатор extern

Непрочитано 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.RUN
 
Регистрация: 29.12.2012
Адрес: Питер
Сообщений: 980
Сказал спасибо: 131
Сказали Спасибо 230 раз(а) в 157 сообщении(ях)
Wiza_ на пути к лучшему
По умолчанию Re: Квалификатор extern

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

Сообщение от zepto Посмотреть сообщение
Вопрос: Я правильно понимаю, что все эти объявления, константы и прочее, желательно размещать именно в заголовочных файлах только для того, что бы не "захламлять" .с файлы?
В C++ *.c не подключится к проекту без соответствующего *.h
Wiza_ вне форума  
Непрочитано 26.03.2015, 12:15  
MisterDi
Почётный гражданин KAZUS.RUN
 
Аватар для MisterDi
 
Регистрация: 13.02.2008
Адрес: Днепр. Украина
Сообщений: 3,284
Сказал спасибо: 441
Сказали Спасибо 1,040 раз(а) в 701 сообщении(ях)
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.RUN
 
Регистрация: 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
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: Квалификатор extern

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

Последний раз редактировалось akegor; 26.03.2015 в 13:19.
akegor вне форума  
Непрочитано 26.03.2015, 13:16  
_Артём_
Гражданин KAZUS.RUN
 
Регистрация: 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, время: 06:37.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.