Справочное руководство по 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):