9.1.7. Безопасное связывание A

9.1.7. Безопасное связывание A

При использовании перегрузки складывается впечатление, что в программе можно иметь несколько одноименных функций с разными списками параметров. Однако это лексическое удобство существует только на уровне исходного текста. В большинстве систем компиляции программы, обрабатывающие этот текст для получения исполняемого кода, требуют, чтобы все имена были различны. Редакторы связей, как правило, разрешают внешние ссылки лексически. Если такой редактор встречает имя print два или более раз, он не может различить их путем анализа типов (к этому моменту информация о типах обычно уже потеряна). Поэтому он просто печатает сообщение о повторно определенном символе print и завершает работу.

Чтобы разрешить эту проблему, имя функции вместе с ее списком параметров декорируется так, чтобы получилось уникальное внутреннее имя. Вызываемые после компилятора программы видят только это внутреннее имя. Как именно производится такое преобразование имен, зависит от реализации. Общая идея заключается в том, чтобы представить число и типы параметров в виде строки символов и дописать ее к имени функции.

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

Декорирование имен не применяется к функциям, объявленным с помощью директивы extern "C", так как лишь одна из множества перегруженных функций может быть написана на чистом С. Две функции с различными списками параметров, объявленные как extern "C", редактор связей воспринимает как один и тот же символ.

Упражнение 9.1

Зачем может понадобиться объявлять перегруженные функции?

Упражнение 9.2

Как нужно объявить перегруженные варианты функции error(), чтобы были корректны следующие вызовы:

int index;

int upperBound;

char selectVal;

// ...

error( "Array out of bounds: ", index, upperBound );

error( "Division by zero" );

error( "Invalid selection", selectVal );

Упражнение 9.3

Объясните, к какому эффекту приводит второе объявление в каждом из приведенных примеров:

(a) int calc( int, int );

int calc( const int, const int );

(b) int get();

double get();

(c) int *reset( int * );

double *reset( double * ):

(d) extern "C" int compute( int *, int );

extern "C" double compute( double *, double );

Упражнение 9.4

Какая из следующих инициализаций приводит к ошибке? Почему?

(a) void reset( int * );

void (*pf)( void * ) = reset;

(b) int calc( int, int );

int (*pf1)( int, int ) = calc;

(c) extern "C" int compute( int *, int );

int (*pf3)( int*, int ) = compute;

(d) void (*pf4)( const matrix ) = 0;

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Софтерра: Безопасное катание на слонах

Из книги Журнал «Компьютерра» № 7 от 21 февраля 2006 года автора Журнал «Компьютерра»

Софтерра: Безопасное катание на слонах Автор: Феликс МучникВ стародавние времена путешествие на слонах было для европейцев опасным и трудным и вряд ли доставляло большое удовольствие. Это было просто необходимостью, ведь другого транспорта для пересечения джунглей не


Динамическое связывание

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Динамическое связывание Упрощенно говоря, динамическое связывание, или динамическая привязка, - это подход, с помощью которого можно создавать экземпляры заданного типа и вызывать их члены в среде выполнения и условиях, когда во время компиляции о типе еще ничего не


Связывание видов

Из книги ArchiCAD 11 автора Днепров Александр Г

Связывание видов Среди инструментов визуализации ArchiCAD существует механизм, назначение которого – одновременное совместное отображение двух различных видов. Какой в этом смысл?Необходимость в этом возникает довольно часто. Например, для визуальной привязки объектов


Связывание с АТД

Из книги Основы объектно-ориентированного программирования автора Мейер Бертран

Связывание с АТД Класс, как неоднократно говорилось, является реализацией АТД, заданного формальной спецификацией или неявно подразумеваемого. В начале лекции отмечалось, что утверждения можно рассматривать, как способ введения в класс семантических свойств, лежащих в


Типизация и связывание

Из книги Системное программирование в среде Windows автора Харт Джонсон М

Типизация и связывание Хотя как читатель этой книги вы наверняка отличите статическую типизацию от статического связывания, есть люди, которым подобное не под силу. Отчасти это может быть связано с влиянием языка Smalltalk, отстаивающего динамический подход к обеим задачам


Неявное связывание

Из книги TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security) автора Фейт Сидни М

Неявное связывание Неявное связывание, или связывание во время загрузки (load-time linking) является простейшей из двух методик связывания. Порядок действий в случае использования Microsoft C++ следующий:1. После того как собраны все необходимые для новой DLL функции, осуществляется


Явное связывание

Из книги Стандарты программирования на С++. 101 правило и рекомендация автора Александреску Андрей

Явное связывание Явное связывание, или связывание во время выполнения (run-time linking), требует, чтобы в программе содержались конкретные указания относительно того, когда именно необходимо загрузить или освободить библиотеку DLL. Далее программа получает адрес запрошенной


Связывание сокета

Из книги Компьютерные советы (сборник статей) автора Автор неизвестен

Связывание сокета Следующий шаг заключается в привязке сокета к его адресу и конечной точке (endpoint) (направление канала связи от приложения к службе). Вызов socket, за которым следует вызов bind, аналогичен созданию именованного канала. Однако не существует имен, используя


11.9.3 Связывание

Из книги C++. Сборник рецептов автора Диггинс Кристофер

11.9.3 Связывание Сервер DHCP хранит таблицу соответствия между клиентами и их конфигурационными параметрами. Связывание заключается в назначении каждому клиенту IP-адреса и набора конфигурационных


38. Практикуйте безопасное перекрытие

Из книги CSS3 для веб-дизайнеров автора Сидерхолм Дэн

38. Практикуйте безопасное перекрытие РезюмеОтветственно подходите в перекрытию функций. Когда вы перекрываете виртуальную функцию, сохраняйте заменимость; в частности, обратите внимание на пред- и постусловия в базовом классе. Не изменяйте аргументы по умолчанию


Безопасное извлечение USB-устройств

Из книги iOS. Приемы программирования автора Нахавандипур Вандад

Безопасное извлечение USB-устройств Казалось бы, для чего создавать такую тему? Многим известно, что перед тем, как выдернуть флэшку, нужно путем нажатия на значок в системном трее безопасно извлечь устройство. Это понятно, но что делать, если такого значка не появляется?


9.5. Безопасное копирование объекта

Из книги Домены. Все, что нужно знать о ключевом элементе Интернета автора Венедюхин Александр

9.5. Безопасное копирование объекта ПроблемаТребуется иметь безопасные при исключениях конструктор копирования и оператор присваивания базового класса.РешениеПримените тактику, предложенную в рецепте 9.4, а именно сначала выполните все действия, которые могут


Безопасное упрощение

Из книги Выжить в цифровом мире. Иллюстрированные советы от «Лаборатории Касперского» автора Дьяков Михаил

Безопасное упрощение Как и в примере с фотогалереей, который обсуждался ранее в этой главе, брызги CSS3, которые мы добавляем в этом примере, никак не затрагивают браузеры, которые пока что не поддерживают эти свойства.В итоге самое важное, что каждый из этих элементов –


8.8. Безопасное хранение файлов в песочнице приложения

Из книги автора

8.8. Безопасное хранение файлов в песочнице приложения Постановка задачи Требуется, чтобы iOS защищала файлы, расположенные в песочнице вашего приложения, от несанкционированного считывания. Такое считывание, в частности, могут выполнять файловые менеджеры для iOS, которые


Безопасное администрирование

Из книги автора

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


Совет 41: Безопасное скачивание

Из книги автора

Совет 41: Безопасное скачивание Если вам приглянулась полезная программка, не стоит скачивать ее по первой ссылке, выданной поисковиком, — программа, возможно, будет работать, вот только вместе с ней вам завернут неприятный сюрприз. Ведь один из способов распространения