Страницы

Поиск по вопросам

суббота, 21 декабря 2019 г.

Видоизменение имен функциий

#cpp #компилятор


Для чего компиляторы C++ "манглят" имена функций.
    


Ответы

Ответ 1



Смотрите, компиляторы C++ унаследовали линкер из C. В C-шном линкере имя функции напрямую отображалось на имя объекта. Это работало, поскольку в C нет перегруженных функций. Но в C++ перегрузки функций есть (а также пространства имён и классы), и функции int f(int x) { ... } и int f(int x, int y) { ... } получили бы одинаковое имя! А компоновщик такую ситуацию обрабатывать не умел, для него все имена должны были быть уникальны. Для того, чтобы написанные выше две функции смогли скомпоноваться, и чтобы и не менять логику компоновщика, придумали простой выход: кодировать сигнатуру функции, то есть, типы параметров (а также имя класса и пространство имён), в имени, передавать компоновщику дополненное имя. В принципе, такое видоизменение имён не является обязательным, и не требуется стандартом. Тем не менее, это популярная техника реализации взаимодействия компилятора и компоновщика, которая применяется как в стандарте POSIX, так и в Windows ABI.

Комментариев нет:

Отправить комментарий