#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 это длина имени функции
Комментариев нет:
Отправить комментарий