Поделиться через


Класс хранения

Описатель класса хранения в определении функции предоставляет ей класс хранения extern или static.

Синтаксис

function-definition:
declaration-specifiersнеоб. attribute-seqнеоб. declarator declaration-listнеоб. compound-statement

/* attribute-seq используется только в системах Майкрософт */

declaration-specifiers:
storage-class-specifier declaration-specifiersнеоб.
type-specifier declaration-specifiersнеоб.
type-qualifier declaration-specifiersнеоб.

storage-class-specifier: /* Для определений функций */
extern
static

Если определение функции не содержит , storage-class-specifierкласс хранилища по умолчанию имеет значение extern. Вы можете явно объявить функцию как extern, но она не требуется.

Если объявление функции содержит storage-class-specifier extern, идентификатор имеет ту же компоновку, что и любое видимое объявление идентификатора с областью файла. Если нет видимого объявления с областью действия файла, идентификатор имеет внешнюю компоновку. Если идентификатор имеет область файла и нет storage-class-specifier, идентификатор имеет внешнюю компоновку. Внешняя компоновка означает, что каждый экземпляр идентификатора определяет один и тот же объект или функцию. Дополнительные сведения о компоновке и области файлов см. в разделе "Время существования", "Область", " Видимость" и "Компоновка".

Объявления функций в области видимости блока с описателем класса хранения, отличным от extern, приводят к ошибкам.

Функция с static классом хранилища отображается только в исходном файле, в котором он определен. Все остальные функции, независимо от того, предоставляются extern ли они классу хранилища явно или неявно, отображаются во всех исходных файлах программы. Если требуется класс хранения static, он должен быть объявлен в первом объявлении функции (при его наличии) и в определении функции.

Блок, относящийся только к системам Майкрософт

При включенных расширениях Майкрософт функции, первоначально объявленной без класса хранения (или с классом хранения extern), предоставляется класс хранения static, если определение этой функции находится в том же исходном файле и в нем явно указан класс хранения static.

При компиляции с параметром компилятора /Ze функции, объявленные в блоке с помощью extern ключевого слова, имеют глобальную видимость, которая не имеет значения true при компиляции с помощью /Za. Эта функция не должна полагаться на то, если переносимость исходного кода является соображением.

Завершение блока, относящегося только к системам Майкрософт

См. также

Определения функций в C