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



>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):