Просмотр искаженных имен компилятора в C ++ - PullRequest
7 голосов
/ 16 апреля 2009

Как просмотреть сгенерированные компилятором искаженные имена для перегруженных функций в C ++? Я использую VC9, но приветствуются ответы и для других компиляторов.

Редактировать: Я считаю все ответы полезными здесь. Принимая тот, который мне понравился больше всего.

Ответы [ 6 ]

8 голосов
/ 16 апреля 2009

Вы можете увидеть оформленные имена функций с помощью Dependency Walker .

Откройте любую DLL \ EXE в средстве просмотра зависимостей, и на правой панели вы увидите список имен оформленных функций.

7 голосов
/ 16 апреля 2009

Так как вы также спрашиваете о других компиляторах. В наборе инструментов gnu есть инструмент под названием nm. Вы получите его на Linux и Cygwin, и я считаю, что он также доступен в Mingw. Вызов его без параметров покажет искаженные символы в двоичном файле. Вызов его с --demangle сделает очевидным.

5 голосов
/ 16 апреля 2009

Вы можете посмотреть в файле карты. Предполагая, что у вас включено создание файла карты.

5 голосов
/ 16 апреля 2009

Вы можете просмотреть украшенные (искаженные) имена с помощью Dumpbin .

3 голосов
/ 08 мая 2009

Хотя все вышеперечисленное работает, есть прекрасный документированный способ просмотра искаженных имен с помощью Список файлов : страницы свойств проекта -> C / C ++ -> выходные файлы -> Выход ассемблера.

(РЕДАКТИРОВАТЬ :)

Существует причина, по которой списочные файлы и DUMPBIN задокументированы как способы просмотра украшенных имен. И файл карты, и средство обхода зависимостей, предлагаемые в качестве решений, отображают только оформленные имена. Если у вас есть несколько перегрузок имени функции, вам будет сложно сопоставить их с различными оформленными именами, которые вы увидите. (Это более или менее воссоздание схемы декорирования. Хотя возможно , оно разрушает всю первоначальную цель.)

0 голосов
/ 03 ноября 2015

Команда linux gnu tool chain nm может использоваться для просмотра искаженного имени.

#include<iostream> 
using namespace std;

int fun1(){}
int fun1(int){}
int main()
{
return 0;
}
#g++ name_decoration_2.cpp
#nm a.out
...
...
000000000040064e T _Z4fun1i
0000000000400648 T _Z4fun1v
U _ZNSt8ios_base4InitC1Ev@@GLIBCXX_3.4
U _ZNSt8ios_base4InitD1Ev@@GLIBCXX_3.4
...