Сделай Сам Свою Работу на 5

R.7.2 Описание перечисления





 

Перечисление является отдельным целочисленным типом (§R.3.6.1) с константами-именами. Его имя в своей области видимости становится конструкцией имя-перечисления, т.е. служит зарезервированным словом.

имя-перечисления:

идентификатор

спецификация-перечисления:

enum идентификатор opt { список-перечисления }

список-перечисления:

элемент-перечисления

список-перечисления, элемент-перечисления

элемент-перечисления:

идентификатор

идентификатор = выражение-константа

Все идентификаторы из списка-перечисления считаются описанными как константы и могут появляться всюду, где требуются константы. Если не было элементов перечисления с =, то значения констант начинаются с нуля и последовательно увеличиваются на единицу по мере продвижения в списке слева направо. Если элемент перечисления встретился с =, то его идентификатор принимает заданное значение, а последующие идентификаторы без инициализирующей части будут получать возрастающие значения, начиная с заданного. Значение элемента перечисления должно быть типа int или значением, которое можно привести к int с помощью стандартных целочисленных преобразований (§R.4.1).



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

enum {a, b, c=0};

enum {d, e, f=e+2};

значения a, c, и d заданы как 0, b и e как 1, а f как 3.

Каждое перечисление является целочисленным типом, который отличен от всех других целочисленных типов. Типом элемента перечисления считается данное перечисление. Значение элемента перечисления или объекта типа перечисления преобразуется к целому с помощью стандартных целочисленных преобразований (§R.4.1). Например, в следующем фрагменте:

enum color {red, yellow, green=20, blue};

color col = red;

color* cp =&col;

if (*cp == blue) //…

color задан как целочисленный тип, описывающий разные цвета, col описан как объект этого типа, а cp как указатель на объект этого типа. Возможными значениями объекта типа color являются red, yellow, green, blue. Эти значения можно преобразовать в целые значения 0, 1, 20 и 21. Поскольку каждое перечисление - это отдельный тип, объекту типа color можно присваивать только значения типа color, например,



color c = 1; // ошибка: несоответствие типов

// нет преобразования от int в color

int i = yellow; // нормально: yellow преобразуется в int со значением 1

// стандартное целочисленное преобразование

Обратитесь также к §R.18.3.

Элементы перечисления, определенные в классе (§R.9), относятся к области видимости этого класса, и к ним можно обращаться извне функций-членов этого класса только с помощью явного уточнения именем класса (§R.5.1). Имя самого типа перечисления локально в этом классе (§R.9.7), например,

class X {

public:

enum direction {left='l', right='r'};

int f(int i)

{ return i==left ? 0 : i==right ? 1 : 2; }

};

 

void g(X* p)

{

direction d; // ошибка: `direction' вне

int i; // области видимости

i = p-›f(left); // ошибка: `left' тоже невидим

i = p-›f(X::right); // нормально

//…

}

 

R.7.3 Описания asm

 

Описание asm имеет вид:

описание-asm:

asm ( строка-литерал );

Назначение описания asm определяется реализацией. Обычно оно используется для передачи информации от транслятора к ассемблеру.

 

R.7.4 Спецификации связи

 

С помощью спецификации-связи можно связать (§R.3.3) фрагменты программ на C++ и на другом языке:

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

extern строка-литерал { список-описаний opt }

extern строка-литерал описание

список-описаний:

описание

список-описаний описание

Требуемое связывание задается с помощью строки-литерала. Ее назначение определяется реализацией. Но во всех реализациях должно быть предусмотрено связывание с функцией на языке C ("C") и с функцией на языке C++ ("C++"). По умолчанию связывание задается как "C++", например,



complex sqrt(complex); // по умолчанию связывание с C++

extern "C" {

double sqrt(double); // связывание с C

}

Спецификации связи могут быть вложенными. Спецификация связи не задает область видимости. Спецификация-связи может встретиться только в файловой области видимости (§R.3.2). Спецификация-связи для класса относится к объектам, описанным в нем, и функциям, не являющимся членами. Спецификация-связи, относящаяся к некоторой функции, относится и ко всем объектам и функциям, описанным в ней. Описание связи, содержащее неизвестную для реализации строку, считается ошибочным.

Если функция имеет более одной спецификации-связи, то они должны быть согласованы, т.е. задавать одну и ту же строку-литерал. Описание функции без указания спецификации-связи не должно предшествовать первому указанию спецификации связи для этой функции. Функция может быть описана без указания спецификации связи даже после явного указания спецификации связи, но связывание, явно заданное в более раннем описании, не будет устранено таким описанием функции.

Из множества перегруженных функций (§R.13) с данным именем не более одной может иметь связывание с языком C, см. §R.7.4.

Связывание можно установить для объектов, например:

extern "C" {

//…

_iobuf_iob[_NFILE];

//…

int _flsbuf(unsigned,_iobuf*);

//…

}

Когда задается спецификация связи, то функции и объекты можно описать как статические внутри { }. Для таких функций или объектов команда связывания игнорируется. Иначе, функция, описанная при задании связи, трактуется, как если бы она была явно описана как extern, например, ниже второе описание ошибочно (§R.7.1.1):

extern "C" double f();

static double f(); // ошибка

Объект, описанный внутри конструкции

extern "C" {/*… */}

все же считается определенным, а не просто описанным.

Связывание объектов на C++ с объектами, определенными на других языках, так же как и обратное связывание, зависит от языков и реализации. Такое связывание возможно только в том случае, когда алгоритмы размещения объектов в памяти являются достаточно схожими для двух языков.

Если для задания связи в строке-литерале из спецификации-связи используется имя языка программирования, то рекомендуется, чтобы написание этого имени копировалось из документа, определяющего данный язык, например, Ada (а не ADA) и Fortran (а не FORTRAN).

 

 

R.8 Описатели

 

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

список-описаний:

описатель-с-инициализатором

список-описаний , описатель-с-инициализатором

описатель-с-инициализатором:

описатель инициализатор opt

Описание состоит из двух частей: спецификации (спецификация-описания; см. §R.7.1) и описателей (список-описателей). Спецификации задают основной тип, класс памяти или другие свойства описываемых объектов и функций. Описатели задают имя этих объектов и функций, а также, возможно, изменяют тип с помощью таких операций, как * (указатель на) и () (функция возвращающая). В описателе также можно задать начальные значения, инициализация обсуждается в §R.8.4 и §R.12.6.

Описатели имеют такой синтаксис:

описатель:

имя-в-описателе

операция-ptr описатель

описатель ( список-описаний-параметров ) список-спецификаций-cv opt

описатель [ выражение-константа opt ]

( описатель )

операция-ptr:

* список-спецификаций-cv opt

& список-спецификаций-cv opt

полное-имя-класса :: * список-спецификаций-cv opt

список-спецификаций-cv:

const

volatile

имя-в-описателе:

имя

имя-класса

~имя-класса

имя-typedef

уточненное-имя-типа

Конструкция имя-класса имеет определенное назначение при описании класса с этим именем, она же используется как уточнение в операции :: для разрешения коллизий в области видимости (§R.12.1, §R.12.4).

 

R.8.1 Имена типов

 

Имя типа необходимо указывать при задании операции явного преобразования типа или в качестве параметра в операциях sizeof или new. Для этого служит конструкция имя-типа, которая синтаксически эквивалентна описанию объекта или функции этого типа, в котором отсутствует имя объекта или функции.

имя-типа:

список-спецификаций-типа абстрактный-описатель opt

список-спецификаций-типа:

спецификация-типа список-спецификаций-типа

абстрактный-описатель:

операция-ptr абстрактный-описатель opt

абстрактный-описатель opt ( список-описаний-параметров ) список-спецификаций cv opt

абстрактный-описатель opt [ выражение-константа opt ]

( абстрактный-описатель )

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

int // int i

int * // int *pi

int *[3] // int *p[3]

int (*)[3] // int (*p3i)[3]

int *() // int *f()

int (*)(double) // int (*pf)(double)

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

 

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.