名前マングリング (C++ のみ)
名前マングリングは、 関数名および変数名を固有の名前にエンコードして、 リンカーが言語内の共通名を分離できるようにすることです。また、型名もマングルできます。 名前マングリングは、多重定義フィーチャーの機能性および異なるスコープ内での可視性を向上させるために、 一般的に使用されています。 モジュールをコンパイルする場合、コンパイラーは関数引数の型をエンコードして、関数名を生成します。 ネーム・スペース内に変数がある場合、同じ変数名が複数のネーム・スペース内に存在できるように、 ネーム・スペースの名前はこの変数名にマングルされます。 C++ コンパイラーは、C 変数が存在するネーム・スペースを識別するために、C 変数名もマングルします。
マングル名を作成する方法は、ソース・コードをコンパイルするために使用する オブジェクト・モデルによって異なります。特定のオブジェクト・モデルを使用してコンパイルされた クラスのオブジェクトのマングル名は、別のオブジェクト・モデルを使用してコンパイルされた 同じクラスのオブジェクトのマングル名とは異なります。オブジェクト・モデルは、コンパイラー・オプションまたは プラグマによって制御されます。
C++ コンパイラーによってコンパイルされたライブラリーやオブジェクト・ファイルを C モジュール
にリンクする場合は、名前マングリングを使用すべきではありません。C++ コンパイラーが関数の名前をマングリングしないようにするには、以下の例
に示したように、1 つ以上の宣言に extern "C" リンケージ指定子を適用することができます。
extern "C" {
int f1(int);
int f2(int);
int f3(int);
};
この宣言は、関数 f1、f2、および f3 の参照をマングルしないようにコン
パイラーに指示しています。C++ で定義された関数をマングリングしないようにして、その関数を C から呼び出せるようにするため
にも extern "C" リンケージ指定子を使用することができます。例えば、次のように指定します。
extern "C" {
void p(int){
/* not mangled */
}
};
複数レベルのネスト extern 宣言では、最も内側の
extern 指定が優先します。
extern "C" {
extern "C++" {
void func();
}
}
この例では、func は C++ リンケージを持ちます。