Глава 9. Описатели и спецификаторы данных________________________197
стеке. Соглашение, навязываемое разработчиком, должно выполняться и пользователем компонуемого модуля.
Применяя спецификатор extern к описанию функции, вы заставляете компилятор сделать две вещи:
• Использовать принятый в С метод передачи параметров
• Использовать принятое в С соглашение об именах
Согласно принятому в С соглашению к именам функций приставляется символ подчеркивания (_) и они не уточняются. Уточнение имен (name mangling; в буквальном переводе означает приблизительно "искажение имен", — прим. nepee.) — это операция компилятора, служащая для поддержки перегрузки операций и функций. Подробнее уточнение имен обсуждается в главах 15 "Перегрузка функций" и 16 "Перегрузка операций".
Спецификатор компоновки extern "с" употребляется в качестве префикса или в комплексе со скобками для задания компоновки С нескольким функциям. Вот два примера:
*
// Одинокая функция, использующая компоновку С extern "С" void Foo( int a) ;
// Группа функций, использующих принятые в С // соглашение об именах и компоновку extern "С" {
void OneFunction( char a) ;
int TwoFunctions( float f);
}
Ниже приведена выдержка из map-файла программы, в которой функция Foo определена так, как только что было показано (чтобы добиться аналогичного результата, установите в IDE опцию Options, Project, Linker, Map File, Publics):
Адрес Значение 0001:00000000 Idle _acrtused 0001:00000074 Idle _GetExceptDLLinfo 0001:00000070 Idle _Foo
Как видно из этого фрагмента, имя не уточнено и у него появилась приставка — символ подчеркивания (примеры уточненных имен см. в главе 15 "Перегрузка функций").
Объявление компоновки в стиле Pascal
Логической противоположностью компоновки С является компоновка в стиле Pascal. Если вы писали программу или библиотечный модуль непо-