Глава 15. Перегрузка функций____________________________________367

В этом фрагменте символы выглядят совсем как обычные объявления функций. Ниже приведен фрагмент .map-файла с именами тех же самых функций, но после уточнения.

0001:00000089 Idle @Print$qc 0001:ООООООАО Idle @Print$qf 0001:00000074 Idle @Print$qi

Таблица символов содержит имена, используемые в программе. По ассоциированному с именем адресу C++ вызывает нужную функцию. Именно уникальные имена, создаваемые с помощью алгоритма уточнения, компоновщик программ использует для поиска нужной функции.

Замечание

C++ использует уточненные имена для установления однозначного соответствия уникальных имен функций и адресов. Диалоговое окно Project Options раздел Linker позволяет выбрать, какая версия имен будет записана в .map-файл. Обычно необходимости в .map-файле не возникает, однако это весьма полезная возможность: сравнение двух вариантов .map-файла позволяет увидеть, как генерируются уникальные имена.

Разрешение вызовов функций

Когда вы объявляете функцию, компилятором создается графа в таблице символов. Компилятор уточняет имя, присваивает ему адрес и сохраняет эту информацию. Далее компоновщик разрешает (resolve) встречающиеся вызовы функций, находя их по адресам и сравнивая найденные имена с хранящимися в таблице символов.

Так как уточненные имена используются для установления соответствия между функциями и их местоположением в памяти, то для однозначности имена обязаны быть уникальными. Таблицу символов можно считать словарем, а адреса — его статьями. Если имя не уникально, то поиск соответствия становится невозможным.

Чтобы дать программистам возможность использовать одинаковые имена для похожих по смыслу функций, компилятор и уточняет имена, помещая в качестве части имени типы аргументов. Тем самым конфликт имен предотвращается. Если внимательно посмотреть на имена в уточненной версии .map-файла, можно заметить, что компилятор Borland C++ присоединяет к имени функции символы '$q', за которыми следует первая буква .имени типа.

Замечание

1В руководстве Annotated Reference Manual (ARM) приводится несколько другой алгоритм уточнения имен. Однако нам важна здесь не реализация, а результат.