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

Уточнение имен

С уточнением имен следует считаться при разработке программ на нескольких языках программирования. Когда вы объявляете функцию C++ в другом языке, например, в Visual Basic, вы должны помнить, что имя у нее не совсем то, которое вы ей дали. Оно изменилось, иначе говоря, это имя уточнено.

Если вы пишете функции C++ для использования в DLL, то в дополнение к другим требованиям, связанным с DLL, вам наверняка потребуется спецификатор extern "с". Этот спецификатор запрещает компилятору C++ уточнять имена, перед которыми он стоит.

Многие функции в библиотеках Borland C++ (посмотрите заголовочные файлы) реализованы так, чтобы сохранить совместимость с компиляторами языка С. Примеры правильного использования спецификатора extern "с" вы найдете в объявлениях этих функций и в справочных файлах к ним.

Компилятор C++ уточняет имя каждой функции. Этим обеспечивается уникальность имен, поскольку по ним разрешаются вызовы функций. Имена функций уточняются, затем им ставятся в соответствие адреса и заносятся в таблицу символов. Именно по этим адресам компилятор производит вызовы функций. Все не так уж сложно.

Таблица символов

Таблица символов — это область памяти для хранения имен, используемых в программе. Вспомним главу 4 "Препроцессор": сначала вызывается препроцессор, а затем выполняется компиляция. Компилятор берет каждое уникальное имя функции, уточняет его, помещает уточненное имя в таблицу символов и присваивает имени относительный адрес.

Адреса назначаются функциям потому, что машинный код реализован на простых командах, подобных команде call, которые работают с адресами, а не именами. Компилятор C++ разрешает вызов функции, основываясь на найденных в таблице символов имени и адресе. На листинге 15.1 приведен фрагмент .map-файла программы, демонстрирующий уточненные имена в том виде, в котором они фигурируют в таблице символов.

h03651.jpg

1 // SYMBOLS.СРР — Взгляд на таблицу символов

2 #include <stdio.h>

3 // Программа демонстрирует перегрузку функций.

4 // Обратите внимание на файл SYMBOLS.MAP -

5 // там приводятся уточненные имена.

6 // printf использована для простоты реализации.