2009-04-16 15 views
7

C++' da aşırı yüklenmiş fonksiyonlar için derleyici tarafından oluşturulan mandallı isimleri nasıl görüntüleyebilirim? VC9 kullanıyorum ama diğer derleyiciler için cevaplar da açığız.View Compiler Mangled Adları C++ 'da

Düzeltme: Buradaki tüm yanıtları burada bulabilirim. En sevdiğim şeyi kabul ediyorum.

cevap

5

Harita dosyasına bakabilirsiniz. Harita dosyası oluşturulduğunu varsayalım.

+0

Ne aynı işlevin birden fazla yüke sahip olur? –

+0

Daha sonra, her aşırı yüklenme için, farklı mandallanmış formlarda aynı ada sahip birçok işlevi göreceksiniz. –

+0

Peki, o zaman bu işlevin çoklu versiyonunu, her birinde karışık isimlerle göreceksiniz. Böylece isim çatışmasının amacı, isim çatışmalarından kaçınmaktır. –

5

Dumpbin ile dekore edilmiş (isimlendirilmiş) adları görüntüleyebilirsiniz.

8

Dekore edilmiş işlev adlarını Dependency Walker kullanarak görebilirsiniz.

Herhangi bir DLL \ EXE'i bağımlılık yürüteçte açın ve sağdaki bölmede süslü işlev adlarının listesini görebilirsiniz. Diğer derleyiciler hakkında da bilgi aldığınızdan beri

6

. Gnu alet zincirinde nm denilen bir alet var. Bunu linux ve cygwin'de alacaksınız ve bunun mingw'de de mevcut olduğuna inanıyorum. Parametresiz olarak çağırmak, ikili sembollerdeki karışık sembolleri gösterecektir. -demangle ile çağırmak belli oluyor.

3

Yukarıdakilerin tümü çalışırken, Listing Files: Project Özellik Sayfaları -> C/C++ -> Çıktı Dosyaları -> Birleştirici Çıktısı kullanarak karışık adları görüntülemek için güzel bir documented yolu vardır.

(DÜZENLEME :)

sadece Liste dosya ve DUMPBIN dekore adlarını görmek için yollar olarak belgelenmiştir bir sebep yoktur. Çözümler olarak önerilen hem harita dosyası hem de bağımlılık yürüteç, yalnızca süslü adlar görüntüler. Bir işlev adında birden fazla aşırı yüklenme varsa, bunları göreceğiniz çeşitli dekore edilmiş adlarla eşleştirmenin zor bir zamanına sahip olursunuz. (Bu, dekorasyon şemasının daha fazla veya daha az yeniden yapılandırılmasıdır. possible iken, tüm orijinal amacı yitirir.)

0

linux gnu takım zinciri nm komutu, karışık adı görmek için kullanılabilir.

#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 [email protected]@GLIBCXX_3.4 
U [email protected]@GLIBCXX_3.4