C++でオーバーロードされた関数のコンパイラ生成の名前を表示する方法を教えてください。私はVC9を使っていますが、他のコンパイラの答えも歓迎します。C++でコンパイラが抱かれた名前を表示
編集:ここではすべての回答が役に立ちます。私が一番好きなものを受け入れる。
C++でオーバーロードされた関数のコンパイラ生成の名前を表示する方法を教えてください。私はVC9を使っていますが、他のコンパイラの答えも歓迎します。C++でコンパイラが抱かれた名前を表示
編集:ここではすべての回答が役に立ちます。私が一番好きなものを受け入れる。
マップファイルを見ることができます。地図ファイルの生成がオンになっていると仮定します。
装飾された(マングルされた)名前はDumpbinで表示できます。
Dependency Walkerを使用して、装飾された関数名を確認できます。
依存関係ウォーカーで任意のDLL \ EXEを開き、右側のウィンドウに装飾された関数名の一覧が表示されます。
他のコンパイラについても質問しています。 gnuツールチェーンにnmというツールがあります。あなたはlinuxとcygwinでそれを得るでしょう、そして、私はそれもmingwで利用できると信じています。パラメータなしでそれを呼び出すと、バイナリにマングルされたシンボルが表示されます。それを--demangleと呼ぶことは明らかです。
上記のすべての作業は、Listing Files:Projectプロパティページ - > C/C++ - >出力ファイル - >アセンブラ出力を使用して、変更された名前を表示する方法があります。
は(EDITは:)
のみリストファイルとDUMPBINは装飾名を確認する方法として文書化されている理由があります。解決策として提案されたマップファイルと依存関係ウォーカーの両方が装飾名のみを表示します。関数名のオーバーロードが複数ある場合は、表示されているさまざまな装飾された名前に一致させるのが難しくなります。 (possibleの間は、元の目的をすべて破っています。)
linux gnuツールチェーン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 [email protected]@GLIBCXX_3.4
U [email protected]@GLIBCXX_3.4
? –
次に、それぞれのオーバーロードに対して、異なる名前を付けられた形式で同じ名前の多数の関数がラップされています。 –
これで、その機能の複数のバージョンが表示され、それぞれの名前が変更されたフォームになります。したがって、名前の衝突を避けるために、名前のmanglingの目的。 –