Справочное руководство по C++ | страница 37



>описания:

> спецификации-описания >opt список-описателей >opt;

> описание-asm

> определение-функции

> спецификация-связи

Описатели в списке-описателей (§R.8) содержат описываемые идентификаторы. Конструкция спецификации-описания может отсутствовать только в определении функций (§R.8.3) или в описании функций. Список-описателей может быть пустым, только при описании класса (§R.9) или перечисления (§R.7.2), т.е. когда спецификация-описания есть спецификация-класса или спецификация-перечисления. Конструкция описание-asm объясняется в §R.7.3, а спецификация-связи в §R.7.4. Описание происходит в определенной области видимости (§R.3.2), правила области видимости приводятся в §R.10.4.

R.7.1 Спецификации

В описании можно использовать следующие спецификации:

>спецификация-описания:

> спецификация-класса-памяти

> спецификация-типа

> спецификация-fct

> спецификация-шаблона-типа

> friend

> typedef

>спецификации-описания:

> спецификации-описания >opt спецификация-описания

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

>typedef char* Pc;

>static Pc; // ошибка: нет имени

Здесь описание static Pc является незаконным, поскольку не указано никакого имени статической переменной типа Pc. Чтобы иметь переменную типа int с именем Pc, необходимо задать спецификацию-типа int, чтобы показать, что (пере)определяется имя Pc из typedef, а не просто Pc является одним из элементов последовательности конструкций спецификация-описания, например,

>void f(const Pc); // void f(char* const)

>void g(const int Pc); // void g(const int)

Укажем, что поскольку signed, unsigned, long и short по умолчанию трактуются как int, конструкция имя-typedef, которая появляется после одной из перечисленных спецификаций типа, должна задавать (пере)определяемое имя, например,

>void h(unsigned Pc); // void h(unsigned int)

>void k(unsigned int Pc); // void k(unsigned int)

R.7.1.1 Спецификации класса памяти

Спецификации класса памяти могут быть такие:

>спецификация-класса-памяти:

> auto

> register

> static

> extern

Спецификации auto и register могут применяться только для имен объектов, которые описаны в блоке (§R.6.3), или для формальных параметров (§R.8.3). Почти всегда спецификация auto избыточна и используется не часто, так, auto используется, чтобы явно отделить оператор-описание от оператора-выражения (§R.6.2).