名前の特殊処理(Name Mangling)
3704 ワード
まず一つのことを言います.mangleの意味はvt.がむやみに切ったり、壊したりすることです.n.ローリング機.これはname manglingがまずあなたの心を込めて考え出した名前たちを砕いて、それから唯一無二の姿につづることを意味しています.もちろん、このような残忍なことはコンパイラがあなたに隠しています.一般的に、メンバーの名前の前にclass名が付けられ、ユニークな名前になります.たとえば、次のようにします.
コンパイラはどうしてこんなことをしたの?このような派生操作を考慮してください.
関数については、member functionがリロードされるため、より広範なmagling手法(より残酷な粉砕、うんうん)が必要です.
このように変換すると、リロードされた関数エンティティに同じ名前が付けられ、ユニークにするには、パラメータチェーンテーブル(パラメータプロトタイプから入手可能)を追加するしかありません.パラメータタイプも符号化すれば、私たちのx()関数を良好に変換するユニークな効果を生み出すことができます(しかし、extern「C」を宣言すると、nonmember functionsのmangling効果を抑えることができます):
以上はcfrontの符号化方法にすぎず,現在のコンパイラには統一的な符号化方法はない.パラメータと関数名を符号化し,コンパイラは異なるコンパイルモジュール間で限られたタイプの検査を達成した.次のようになります.
void print(const Point3d&){}
しかし、意外にもこのように宣言され、呼び出されました.
void print(const Point3d&);
2つのエンティティがユニークなname-manglingを持っている場合、リンク時に不正な呼び出し操作は決定できないため失敗します.「タイプのセキュリティを確保するリンク動作」と呼ばれる場合があります.関数のタグ(または関数署名と呼ばれ、関数名+パラメータ数+パラメータタイプを指す)エラーのみをキャプチャできるため、楽観的だと思います.「戻りタイプ」がエラーを宣言すると、チェックできません.現在のコンパイルシステムでは、名前をブロックして変換するためのいわゆるdemanglingツールがあり、ユーザーは依然として「タイプ名を知らない大きな幸せの中にいる」ことができます.name-manglingの手法は残忍で、結果は耐えられないので、一般的に使用者に見せることはありません.
class Bar(){public: int ival;};
// ival :
//member name-mangling
ival__3Bar
コンパイラはどうしてこんなことをしたの?このような派生操作を考慮してください.
class Foo: public Bar{public: int ival;};
// name-mangling :
class Foo
{
public:
int ival__3Bar;
int ival__3Foo;
};
関数については、member functionがリロードされるため、より広範なmagling手法(より残酷な粉砕、うんうん)が必要です.
class Point
{
public:
void (float newX);
float x();
...
};
//
class Point
{
public:
// ?
void x__5Point(float newX);
float x__5Point();
...
};
このように変換すると、リロードされた関数エンティティに同じ名前が付けられ、ユニークにするには、パラメータチェーンテーブル(パラメータプロトタイプから入手可能)を追加するしかありません.パラメータタイプも符号化すれば、私たちのx()関数を良好に変換するユニークな効果を生み出すことができます(しかし、extern「C」を宣言すると、nonmember functionsのmangling効果を抑えることができます):
class Point
{
public:
void x__5PointFf(float newX);
float x__5PointFv();
...
};
以上はcfrontの符号化方法にすぎず,現在のコンパイラには統一的な符号化方法はない.パラメータと関数名を符号化し,コンパイラは異なるコンパイルモジュール間で限られたタイプの検査を達成した.次のようになります.
void print(const Point3d&){}
しかし、意外にもこのように宣言され、呼び出されました.
void print(const Point3d&);
2つのエンティティがユニークなname-manglingを持っている場合、リンク時に不正な呼び出し操作は決定できないため失敗します.「タイプのセキュリティを確保するリンク動作」と呼ばれる場合があります.関数のタグ(または関数署名と呼ばれ、関数名+パラメータ数+パラメータタイプを指す)エラーのみをキャプチャできるため、楽観的だと思います.「戻りタイプ」がエラーを宣言すると、チェックできません.現在のコンパイルシステムでは、名前をブロックして変換するためのいわゆるdemanglingツールがあり、ユーザーは依然として「タイプ名を知らない大きな幸せの中にいる」ことができます.name-manglingの手法は残忍で、結果は耐えられないので、一般的に使用者に見せることはありません.