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


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

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

Синтаксис

declaration:
declaration-specifiersattribute-seqoptinit-declarator-listopt;

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

declaration-specifiers:
storage-class-specifierdeclaration-specifiersнеоб.
type-specifierdeclaration-specifiersнеоб.
type-qualifierdeclaration-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-specifierauto, 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
Объявления и типы
Общие сведения об объявлениях