Классы хранения в C
"Класс хранения" переменной определяет время существования элемента: глобальное или локальное. В C эти два времени существования называются "статическое" и "автоматическое". Элемент с глобальным временем существования существует и имеет значение на протяжении всего выполнения программы. Все функции имеют глобальное время существования.
Автоматические переменные или переменные с локальными временем существования выделяются новым хранилищем каждый раз, когда элемент управления выполнением передается в блок, в котором они определены. Когда выполнение возвращается, переменные более не имеют понятных значений.
C предоставляет следующие описатели класса хранения:
Синтаксис
storage-class-specifier
:
auto
register
static
extern
typedef
__declspec (
extended-decl-modifier-seq
)
/* Для конкретной корпорации Майкрософт */
__declspec
Кроме того, в объявлении можно использовать только один storage-class-specifier
из declaration-specifier
них. Если нет спецификации класса хранения, объявления в блоке создают автоматические объекты.
Элементы, объявленные с описателем auto
или register
, имеют локальное время существования. Элементы, объявленные с описателем static
или extern
, имеют глобальное время существования.
Поскольку typedef
и __declspec
семантически отличаются от других четырех storage-class-specifier
терминалов, они обсуждаются отдельно. Подробные сведения о typedef
см. в статье Объявления typedef
. Подробные сведения о __declspec
см. в статье Расширенные атрибуты классов хранения.
Размещение объявлений переменных и функций в файлах исходного кода также влияет на класс хранения и видимость. Объявления за пределами всех определений функций отображаются на внешнем уровне. Объявления в определениях функций отображаются на внутреннем уровне.
Точное значение каждого определителя класса хранения зависит от двух факторов:
уровня отображения объявления (внешний или внутренний)
типа объявляемого элемента (переменная или функция)
Описатели классов хранилища для объявлений внешнего уровня и описателей класса хранилища для объявлений внутреннего уровня описывают storage-class-specifier
терминалы в каждом виде объявления и объясняют поведение по умолчанию при storage-class-specifier
пропуске из переменной. Статья Описатели классов хранения с объявлениями функций поможет разобраться с описателями storage-class, используемыми с функциями.