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


Общие сведения об объявлениях

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

Синтаксис

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

                                  /* последовательность-атрибутовнеоб используется только для систем Майкрософт */

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

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

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

  • список-инициализаторов-и-деклараторов:
    инициализатор-декларатор

    список-инициализаторов-и-деклараторов , инициализатор-декларатор

  • инициализатор-декларатор:
    декларатор

    декларатор = инициализатор

Примечание

Этот синтаксис для объявления (declaration) не будет повторяться в следующих разделах.Синтаксис в следующих разделах обычно начинается с нетерминального декларатора (declarator).

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

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

В общей форме объявления переменных в параметре спецификатор-типа задается тип данных для переменной. Спецификатор-типа может быть составным, например когда тип изменен при помощи ключевого слова const или volatile. В параметре declarator содержится имя переменной, которое может быть изменено для объявления массива или типа указателя. Например:

int const *fp;

В приведенном выше примере переменная с именем fp объявляется как указатель на неизменяемое (const) значение типа int. В объявлении можно определить несколько переменных; для этого используется несколько деклараторов, которые разделяются запятыми.

Объявление должно содержать по меньшей мере один декларатор, или его спецификатор типа должен объявлять тег структуры, тег объединения или члены перечисления. Деклараторы предоставляют всю остальную информацию об идентификаторе. Декларатор представляет собой идентификатор, который можно изменить при помощи квадратных скобок ([ ]), звездочек (*) или круглых скобок (( )). В этом случае он объявляет массив, указатель или тип функции соответственно. При объявлении простых переменных (например символьных, целочисленных или с плавающей запятой) или структур и объединений простых переменных декларатор (declarator) представляет собой только идентификатор. Дополнительные сведения о деклараторах см. в разделе Деклараторы и объявления переменных.

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

В объявлениях переменных должен быть указан класс хранения или тип (или и то, и другое). За исключением ключевого слова __declspec в объявлениях допускается только один спецификатор класса хранения. Некоторые спецификаторы класса хранения не допускаются в некоторых контекстах. Класс хранения __declspec может использоваться с другими спецификаторами класса хранения; его можно указывать более одного раза. Спецификатор класса хранения для объявления влияет только на то, каким образом объявленный элемент хранится и инициализируется, и какие части программы могут ссылаться на элемент.

К терминальным спецификаторам-класса-хранения, определенным в языке C, относятся следующие: auto, extern, register, static и typedef. Кроме того, в Microsoft C имеется терминальный спецификатор-класса-хранения __declspec. Все терминальные спецификаторы-класса-хранения, за исключением typedef и __declspec, рассматриваются в разделе Классы хранения. Дополнительные сведения о typedef см. в разделе Объявления typedef. Дополнительные сведения о __declspec см. в разделе Расширенные атрибуты классов хранения.

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

Спецификаторы типа предоставляют некоторые сведения о типах данных в идентификаторах. По умолчанию используется спецификатор типа int. Дополнительные сведения см. в разделе Спецификаторы типа. Спецификаторы типа также могут определять теги типа, имена компонентов структуры и объединения, а также перечисления константы перечисления. Дополнительные сведения см. в разделе Объявления перечислений, Объявления структур и Объявления объединений.

Существует два терминальных квалификатора-типов: const и volatile. Эти квалификаторы определяют дополнительные свойства типов, которые действуют только при обращении к объектам соответствующих типов с l-значений. Дополнительные сведения о ключевых словах const и volatile см. в разделе Квалификаторы типов. Определение l-значений см. в разделе Выражения L-значений и R-значений.

См. также

Ссылки

Общие сведения о синтаксисе языка C

Общие сведения об объявлениях

Основные понятия

Объявления и типы