Глава 11. Функции________________________________________261

extern void Foo(); // Foo определена позже в этом же файле или //в другом файле

несколько устарело. В этом контексте ключевое слово extern нужно для того,- чтобы объявить функцию до того, как она будет использована. Теперь принято помещать объявления функций в заголовочные файлы и прописывать в начале каждого модуля список соответствующих директив ftinciude.

В настоящее время extern используется в комбинации со строкой "С", чтобы предотвратить уточнение (mangling) имени функции компилятором (уточнение имен функций при перегрузке объясняется в главе 15 "Перегрузка функций"). С помощью C++ можно писать динамически подключаемые библиотеки (DLL) и вспомогательные модули для программ на других языках, например Visual Basic и Delphi. Поскольку разработчики обычно имеют дело не с уточненными именами, а с теми,-которые они вводят, то именно эти имена и предоставляются пользователям библиотек и инструментальных модулей.

Допустим, нужно разработать для Visual Basic компоненту с именем

PasswordDialog

Если компилятор C++ уточнит ее имя (что и происходит по умолчанию), то пользователь не сможет вызвать эту функцию иначе как по уточненному имени. Применение спецификатора

extern "С" int PasswordDialog( some msg);

предотвратит уточнение имени.

Спецификатор extern также может быть применен к целым группам функций, которые для этого следует заключить в фигурные скобки:

extern "С" ( type func_namel( arglist);

type func_name2.( arglist) ;

// И т. д. }

Все причины использования этого спецификатора станут более понятны позднее, после рассказа о классах и перегрузке.

Использование модификатора cdecl с функциями

!

В справочной системе Borland IDE cdecl назван модификатором (modifier). Модификатор cdecl используется для объявления переменных в соответствии с соглашениями, принятыми в С. В именах С существенен регистр символов, и к тому же компилятор добавляет к ним символ подчеркивания. Примеры этого можно увидеть во многих файлах заголовков в каталоге