скрытое меню

extern static const

extern

Директива extern подключает внешний ресурс (переменную, структуру и т.д. ) , определенный и скомпилированный в другом файле. То есть extern работает уже на этапе сборки (компоновки).

static

Загадочная директива static . С одной стороны она просто гарантирует , что объект , объявленный с директивой static в конкретном файле c будет использоваться только в этом файле. Это будет только локальный объект и в других файлах *.с будет не доступен . Таким образом в других файлах можно обзывать объекты таким же именем и конфликтов не будет. Это удобно.

Но есть и другая сторона , связанная с размещением в памяти, точнее в какой памяти разместится объект static. Если применительно к контроллерам , то static поместит например массив в SRAM, а без static во FLASH. Вот пример для контроллера STM32 под Atollic True Studio :

uint8_t *str1 = "abc"; поместит в Flash память контроллера (неизменяемая).

uint8_t str2[]="abcd"; компилятор поместит в str2 оперативную память SRAM (изменяемая).

Тут правило такое , что static доверять нельзя и надо реально проверять в какую память помещается static объект.

const

Директива const , как следует из названия , просто защищает объект от изменения. Изначально сам объект может быть и не const , а при перендачи ссылки на него в функцию можно указать const , чтобы никто в функции не захотел изменить этот объект.