KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Брайан Керниган - Язык программирования Си. Издание 3-е, исправленное

Брайан Керниган - Язык программирования Си. Издание 3-е, исправленное

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Брайан Керниган, "Язык программирования Си. Издание 3-е, исправленное" бесплатно, без регистрации.
Перейти на страницу:

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).

А8.2. Спецификаторы типа

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

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

    void

    char

    short

    int

    long

    float

    double

    signed

    unsigned

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

  спецификатор-перечисления

  typedef-имя

Вместе с int допускается использование еще какого-то одного слова - long или short; причем сочетание long int имеет тот же смысл, что и просто long: аналогично short int - то же самое, что и short. Слово long может употребляться вместе с double. С int и другими его модификациями (short, long или char) разрешается употреблять одно из слов signed или unsigned. Любое из последних может использоваться самостоятельно, в этом случае подразумевается int.

Спецификатор signed бывает полезен, когда требуется обеспечить, чтобы объекты типа char имели знак; его можно применять и к другим целочисленным типам, но в этих случаях он избыточен.

За исключением описанных выше случаев объявление не может содержать более одного спецификатора типа. Если в объявлении нет ни одного спецификатора типа, то имеется в виду тип int.

Для указания особых свойств объявляемых объектов предназначаются квалификаторы:

квалификатор-типа:

    const

    volatile

Квалификаторы типа могут употребляться с любым спецификатором типа. Разрешается инициализировать const-объект, однако присваивать ему что-либо в дальнейшем запрещается. Смысл квалификатора volatile зависит от реализации.

Средства const и volatile (изменчивый) введены стандартом ANSI. Квалификатор const применяется, чтобы разместить объекты в памяти, открытой только на чтение (ПЗУ), или чтобы способствовать возможной оптимизации. Назначение квалификатора volatile - подавить оптимизацию, которая без этого указания могла бы быть проведена. Например, в машинах, где адреса регистров ввода-вывода отображены на адресное пространство памяти, указатель на регистр некоторого устройства мог бы быть объявлен как volatile, чтобы запретить компилятору экономить очевидно избыточную ссылку через указатель. Компилятор может игнорировать указанные квалификаторы, однако обязан сигнализировать о явных попытках изменить значение const-объектов.

A8.3. Объявления структур и объединений

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

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

    структуры-или-объединения идентификаторнеоб { список-объявлений-структуры }

    структуры-или-объединения идентификатор

структура-или-объединение:

    struct

    union

Список-объявлений-структуры является последовательностью объявлений элементов структуры или объединения:

список-объявлений-структуры:

    объявление-структуры

    список-объявлений-структуры объявление-структуры

объявление-структуры:

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

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

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

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

список-структуры-объявителей:

    структуры-объявитель

    список-структуры-объявителей , структуры-объявитель

Обычно объявление-структуры является просто объявлением для элементов структуры или объединения. Элементы структуры, в свою очередь, могут состоять из заданного числа разрядов (битов). Такой элемент называется битовым полем или просто полем. Его размер отделяется от имени поля двоеточием:

структуры-объявитель:

    объявитель

    объявительнеоб : константное-выражение

Спецификатор типа, имеющий вид

структуры-или-объединения идентификатор { список-объявлений-структуры }

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*