Страницы

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

среда, 18 декабря 2019 г.

Компилятор С++ добавляет странные символы к именам функций

#cpp


Игрался с gcc и g++ и заметил вот такой интересный момент

Есть исходник

int
start()
{
    return 0;
}


Компилирую его с помощью gcc -c и использую объектник для просмотра таблицы имён
с помощью nm
как и ожидалось получаю

00000000 T start


Если компилировать тот же файл с g++ и просмотреть таблицу имён в объектнике, то видим

00000000 T _Z5startv


Ну и собственно вопрос. Зачем g++ искажает имя функции? есть ли в этом смысл и делают
ли так другие c++ компиляторы?
    


Ответы

Ответ 1



Он не искажает. Он делает замангливания имен. Это нужно с одной целью - в Си нет перегрузки функций - там не может быть двух функций с одинаковым именем и разными сингнатурами (наборами параметров). А вот в с++ - может. И каждый компилятор делает это по своему. В линуксе для gcc есть утилита c++filt которая умеет делать такое преобразование. Для Visual Studio есть утилита Undname.exe которая идет в стандартной поставке. В тех случаях, когда такое поведение нежелательно, применяют extern "C".

Ответ 2



Это нужно для реализации таких особенностей С++, как, например, перегрузка функций и шаблоны.

Ответ 3



На Википедии достаточно написано про Name mangling особенно в External links. Рекомендую почитать, например, в конце добавляются типы параметров функции: i-int, c-char и т. д. А число после _Z это длина имени функции

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

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