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


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

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

Синтаксис

  • определение-функции:
    спецификаторы-объявления необ последовательность-атрибутов необ декларатор список-объявлений необ составной-оператор

    /* Компонент последовательность-атрибутов относится только к системам Microsoft */

  • спецификаторы-объявления:
    спецификатор-класса-хранения спецификаторы-объявления необ

    спецификатор-типа спецификаторы-объявления необ

    квалификатор-типа спецификаторы-объявления необ

  • спецификатор-класса-хранения: /* Для определений функций */
    extern

    static

Если определение функции не содержит спецификатор-класса-хранения, по умолчанию устанавливается класс хранения extern. Функцию можно явно объявить как extern, но это необязательно.

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

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

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

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

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

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

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

См. также

Ссылки

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