Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Керниган Брайан. Язык программирования Си. Издание 3-е, исправленное - royallib.ru.doc
Скачиваний:
338
Добавлен:
11.03.2016
Размер:
1.08 Mб
Скачать

A8. Объявления

То, каким образом интерпретируется каждый идентификатор, специфицируется объявлениями; они не всегда резервируют память для описываемых ими идентификаторов. Объявления, резервирующие память, называются определениями и имеют следующий вид:

объявление :

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

Объявители в списке-инициализаторов-объявителей содержат объявляемые идентификаторы; спецификаторы-объявления представляют собой последовательности, состоящие из спецификаторов типа и класса памяти.

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

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

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

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

список-инициализаторов-объявителей :

    инициализатор-объявитель

    список-инициализаторов-объявителей , инициализатор-объявитель

инициализатор-объявитель :

    объявитель

    объявитель = инициализатор

Объявители содержат подлежащие объявлению имена. Мы рассмотрим их позже, в A8.5. Объявление должно либо иметь по крайней мере один объявитель, либо его спецификатор типа должен определять тег структуры или объединения, либо - задавать элементы перечисления; пустое объявление недопустимо.

A8.1. Спецификаторы класса памяти

Класс памяти специфицируется следующим образом:

спецификатор-класса-памяти :

    auto

    register

    static

    extern

    typedef

Смысл классов памяти обсуждался в A4.

Спецификаторы auto и register дают объявляемым объектам класс автоматической памяти, и эти спецификаторы можно применять только внутри функции. Объявления с auto и register одновременно являются определениями и резервируют намять. Спецификатор register эквивалентен auto , но содержит подсказку, сообщающую, что в программе объявленные им объекты используются интенсивно. На регистрах может быть размещено лишь небольшое число объектов, причем определенного типа: указанные ограничения зависят от реализации. В любом случае к register - объекту нельзя применять (явно или неявно) унарный оператор & .

Новым является правило, согласно которому вычислять адрес объекта класса register нельзя, а класса auto можно.

Спецификатор static дает объявляемым объектам класс статической памяти, он может использоваться и внутри, и вне функций. Внутри функции этот спецификатор вызывает выделение памяти и служит определением; его роль вне функций будет объяснена в A11.2.

Объявление со спецификатором extern , используемое внутри функции, объявляет, что для объявляемого объекта где-то выделена память; о ее роли вне функций будет сказано в A11.2.

Спецификатор typedef не резервирует никакой памяти и назван спецификатором класса памяти из соображений стандартности синтаксиса; речь об этом спецификаторе пойдет в A8.9.

Объявление может содержать не более одного спецификатора класса памяти. Если он в объявлении отсутствует, то действуют следующие правила: считается, что объекты, объявляемые внутри функций, имеют класс auto ; функции, объявляемые внутри функций, - класс extern ; объекты и функции, объявляемые вне функций, - статические и имеют внешние связи (см. A10, A11).