Общие сведения об объявлениях
Объявление задает интерпретацию и атрибуты набора идентификаторов. Объявление, которое также вызывает резервирование хранилища для объекта или функции, именуемой идентификатором, называется "определением". Объявления в 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
Объявления и типы
Общие сведения об объявлениях