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


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

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

Синтаксис

declaration:
declaration-specifiers attribute-seqнеоб. init-declarator-listнеоб. ;

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

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

init-declarator-list:
init-declarator
init-declarator-list , init-declarator

init-declarator:
declarator
declarator = initializer

Примечание.

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

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

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

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

int const *fp;

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

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

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

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

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

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

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

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

См. также

Краткие сведения о синтаксисе языка C
Объявления и типы
Общие сведения об объявлениях