Поговорим подробнее о секциях exports.
Если бы мы смогли заглянуть внутрь компилированного файла библиотеки, то обнаружили бы, что каждая экспортируемая подпрограмма представлена там уникальным символьным именем. Эти имена собраны в таблицу и используются при поиске подпрограмм — с их помощью выполняется динамическая привязка записанных в программе команд вызова к адресам соответствующих процедур и функций в библиотеке. В качестве экспортного имени может выступать любая последовательность символов, причем между заглавными и строчными буквами делается различие.
В стандартном случае экспортное имя подпрограммы считается в точности таким, как ее идентификатор в исходном тексте библиотеки (с учетом заглавных и строчных букв). Например, если секция exports имеет следующий вид,
то это означает, что экспортное имя процедуры будет ’BubleSort’. При желании это имя можно сделать отличным от программного имени, дополнив описание директивой name, например:
exports BubleSort name 'BubleSortIntegers'; |
В итоге, экспортное имя процедуры BubleSort будет ’BubleSortIntegers’.
Экспортные имена подпрограмм должны быть уникальны в пределах библиотеки, поэтому их нужно всегда указывать явно для перегруженных (overload) процедур и функций. Например, если имеются две перегруженные процедуры с общим именем QuickSort,
procedure QuickSort(var Arr: array of Integer); overload; // для целых чиселprocedure QuickSort(var Arr: array of Real); overload; // для вещественных |
то при экспорте этим двум процедурам необходимо явно указать отличные друг от друга экспортные имена:
exports QuickSort(var Arr: array of Integer) name 'QuickSortIntegers'; QuickSort(var Arr: array of Real) name 'QuickSortReals'; |
Полные списки параметров нужны для того, чтобы компилятор мог разобраться, о какой процедуре идет речь в каждом случае.
Еще раз подчеркнем соглашения, используемые при экспорте:
1. В экспортном имени между заглавными и строчными буквами делается различие.
2. По умолчанию экспортное имя совпадает с программным именем, но можно сделать экспортное имя другим, дополнив описание директивой name.
3. Экспортные имена подпрограмм должны быть уникальны в пределах библиотеки.
4. При экспорте перегруженных процедур необходимо явно указать отличные друг от друга экспортные имена и полный список параметров.