Глава 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 используется для объявления переменных в соответствии с соглашениями, принятыми в С. В именах С существенен регистр символов, и к тому же компилятор добавляет к ним символ подчеркивания. Примеры этого можно увидеть во многих файлах заголовков в каталоге