С помощью спецификации-связи можно связать ($$R.3.3) фрагментыпрограмм на С++ и на другом языке: спецификация-связи: extern строка-литерал { список-описаний opt } extern строка-литерал описание список-описаний: описание список-описаний описание Требуемое связывание задается с помощью строки-литерала. Ее назначениеопределяется реализацией. Но во всех реализациях должно бытьпредусмотрено связывание с функцией на языке С ("С") и с функциейна языке С++ ("С++"). По умолчанию связывание задается как "С++",например, complex sqrt(complex); // по умолчанию связывание с C++ extern "C" { double sqrt(double); // связывание с C } Спецификации связи могут быть вложенными. Спецификация связине задает область видимости. Спецификация-связи может встретитьсятолько в файловой области видимости ($$R.3.2). Спецификация-связидля класса относится к объектам, описанным в нем, и функциям, неявляющимся членами. Спецификация-связи, относящаяся к некоторойфункции, относится и ко всем объектам и функциям, описанным в ней.Описание связи, содержащее неизвестную для реализации строку,считается ошибочным. Если функция имеет более одной спецификации-связи, то они должныбыть согласованы, т.е. задавать одну и ту же строку-литерал.Описание функции без указания спецификации-связи не должнопредшествовать первому указанию спецификации связи для этой функции.Функция может быть описана без указания спецификации связи дажепосле явного указания спецификации связи, но связывание, явно заданноев более раннем описании, не будет устранено таким описанием функции. Из множества перегруженных функций ($$R.13) с данным именемне более одной может иметь связывание с языком С, см. $$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" { /*... */ } все же считается определенным, а не просто описанным. Связывание объектов на С++ с объектами, определенными на другихязыках, так же как и обратное связывание, зависит от языков иреализации. Такое связывание возможно только в том случае, когдаалгоритмы размещения объектов в памяти являются достаточно схожимидля двух языков. Если для задания связи в строке-литерале из спецификации-связииспользуется имя языка программирования, то рекомендуется, чтобынаписание этого имени копировалось из документа, определяющего данныйязык, например, Ada (а не ADA) и Fortran (а не FORTRAN).