Если функция, написанная на C++, должна
вызываться из программы на С, Pascal или языке ассемблера (и наоборот, что
часто бывает при использовании существующих динамических библиотек), то
механизм декорирования имен C++ создает некоторые трудности. Они могут быть
причиной сообщений об ошибках при компоновке вроде "Неопределенный символ ххх
в модуле уyу”.
Чтобы обойти возникающие из-за
декорирования проблемы, используется спецификация extern "С". Она
применяется в двух случаях: во-первых, когда следует запретить декорирование
имени определяемой вами функции, и во-вторых, когда вы хотите информировать
компилятор, что вызываемая вами функция не соответствует спецификации связи
C++, применяемой для перегруженных функций.
Вот примеры:
// Функция, которую можно вызывать из С
(прототип):
extern "С"
void FuncForC(void);
// Прототип функции из некоторой
библиотеки не на C++:
extern "С"
void SomeExtFunc (int);
Следует отличать спецификацию связи от
соглашений o вызове. Функция, например, может вызываться в соответствии с
соглашением Pascal (что означает определенный порядок передачи параметров и имя
в верхнем регистре), но иметь спецификацию связи C++, т. е. декорированное имя.
Алгоритм здесь такой: сначала формируется (если не указано extern
"С") декорированное имя, а затем оно подвергается модификации в
соответствии с соглашением о вызове.
Если вы вызываете функции библиотек,
написанных на С или языке ассемблера и у вас есть необходимые заголовочные
файлы на С, то соответствующие директивы включения можно поместить в блок
extern "С", как показано ниже. В противном случае нужно было бы
модифицировать эти файлы, добавив спецификации связи к прототипам функций.
extern "С"
{
#include "asmlib.h"
#include "someclib.h"
}
|