名前の特殊処理(Name Mangling)

3704 ワード

まず一つのことを言います.mangleの意味はvt.がむやみに切ったり、壊したりすることです.n.ローリング機.これはname manglingがまずあなたの心を込めて考え出した名前たちを砕いて、それから唯一無二の姿につづることを意味しています.もちろん、このような残忍なことはコンパイラがあなたに隠しています.一般的に、メンバーの名前の前にclass名が付けられ、ユニークな名前になります.たとえば、次のようにします.
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の手法は残忍で、結果は耐えられないので、一般的に使用者に見せることはありません.