「Cpp 名前マングリング」の版間の差分
(ページの作成:「C++に戻る <table class="mbox-small" style="border:1px solid #aaa; background-color:#f9f9f9; width:22em;" id="RealTitleBanner"> <tr> <td style="width:1px;"></td> <td class="mbox-text plainlist" style="">本来の表記は「<b><span id="RealTitle" style="font-size:large;">C++ 名前マングリング</span></b>」です。この記事に付けられた題名は{{記事名の制約}}から不正確なものとなっています…」) |
|||
11行目: | 11行目: | ||
<br /> | <br /> | ||
== '''名前マングリング''' == | == '''名前マングリング''' == | ||
名前マングリング(Name Mangling)は、C++コンパイラが関数や変数の名前を修飾し、異なるスコープや型に対して一意の名前を生成するプロセスです。C++では関数のオーバーロード、名前空間、クラス、テンプレートなどが名前マングリングの対象となります。これにより、同じ名前の関数でも引数の型や個数が異なれば異なるマングルされた名前が生成されます。 | |||
'''名前マングリングの例:''' | |||
例えば、以下のようなC++のコードがあるとします: | |||
<syntaxhighlight lang="cpp"> | |||
namespace MyNamespace { | |||
class MyClass { | |||
public: | |||
void myFunction(int x); | |||
}; | |||
} | |||
void globalFunction(double y); | |||
</syntaxhighlight> | |||
これをコンパイルすると、名前マングリングが適用されます。実際に生成される名前はコンパイラやプラットフォームによって異なりますが、例えば次のような形になる可能性があります: | |||
<syntaxhighlight lang="text"> | |||
?myFunction@MyNamespace@MyClass@@QAEXH@Z | |||
?globalFunction@@YAXN@Z | |||
</syntaxhighlight> | |||
'''DLLやLibファイルの呼び出しでの名前マングリングの取り扱い:''' | |||
DLLやLibファイルの呼び出しにおいて、マングリングの取り扱いは重要です。異なるコンパイラや言語間でライブラリを共有する場合、名前マングリングが統一されていないと正しく関数を呼び出せません。 | |||
一般的な方法として、C++関数をCスタイルにエクスポートする方法があります。これには extern "C" を使用します。 | |||
'''extern "C" を使用する利点:''' | |||
<syntaxhighlight lang="cpp"> | |||
#ifdef __cplusplus | |||
extern "C" { | |||
#endif | |||
void myFunction(int x); | |||
#ifdef __cplusplus | |||
} | |||
#endif | |||
</syntaxhighlight> | |||
extern "C" ブロック内の関数はCスタイルの名前マングリングが適用され、C++の名前マングリングが無効になります。これにより、他の言語やC言語から直接呼び出すことが容易になります。 | |||
'''利点:''' | |||
言語間の相互運用性: C言語は名前マングリングを行わないため、extern "C" を使用するとC++関数をC言語から利用しやすくなります。 | |||
'''DLLのエクスポート:''' WindowsのDLLでは、extern "C" を使用してエクスポートされた関数は名前マングリングが適用されません。これにより、DLL関数の名前が予測可能になります。 | |||
'''ヘッダーファイルの共有:''' C++関数を含むヘッダーファイルを他のプログラム言語で利用する場合、extern "C" を使って名前マングリングを無効にすると、他の言語で関数を呼び出しやすくなります。 | |||
名前マングリングはコンパイラやプラットフォームに依存するため、言語間の相互運用性を確保するためにextern "C" を使用することは一般的なプラクティスです。 | |||
[[C PlusPlus#C++からの技術|C++]]に戻る | [[C PlusPlus#C++からの技術|C++]]に戻る |
2024年2月27日 (火) 23:40時点における版
C++に戻る
本来の表記は「C++ 名前マングリング」です。この記事に付けられた題名はテンプレート:記事名の制約から不正確なものとなっています。 |
※このページではC++にのみ存在する機能として、記事タイトルがC++ 名前マングリングになっています。
名前マングリング
名前マングリング(Name Mangling)は、C++コンパイラが関数や変数の名前を修飾し、異なるスコープや型に対して一意の名前を生成するプロセスです。C++では関数のオーバーロード、名前空間、クラス、テンプレートなどが名前マングリングの対象となります。これにより、同じ名前の関数でも引数の型や個数が異なれば異なるマングルされた名前が生成されます。
名前マングリングの例:
例えば、以下のようなC++のコードがあるとします:
namespace MyNamespace {
class MyClass {
public:
void myFunction(int x);
};
}
void globalFunction(double y);
これをコンパイルすると、名前マングリングが適用されます。実際に生成される名前はコンパイラやプラットフォームによって異なりますが、例えば次のような形になる可能性があります:
?myFunction@MyNamespace@MyClass@@QAEXH@Z
?globalFunction@@YAXN@Z
DLLやLibファイルの呼び出しでの名前マングリングの取り扱い:
DLLやLibファイルの呼び出しにおいて、マングリングの取り扱いは重要です。異なるコンパイラや言語間でライブラリを共有する場合、名前マングリングが統一されていないと正しく関数を呼び出せません。
一般的な方法として、C++関数をCスタイルにエクスポートする方法があります。これには extern "C" を使用します。
extern "C" を使用する利点:
#ifdef __cplusplus
extern "C" {
#endif
void myFunction(int x);
#ifdef __cplusplus
}
#endif
extern "C" ブロック内の関数はCスタイルの名前マングリングが適用され、C++の名前マングリングが無効になります。これにより、他の言語やC言語から直接呼び出すことが容易になります。
利点:
言語間の相互運用性: C言語は名前マングリングを行わないため、extern "C" を使用するとC++関数をC言語から利用しやすくなります。
DLLのエクスポート: WindowsのDLLでは、extern "C" を使用してエクスポートされた関数は名前マングリングが適用されません。これにより、DLL関数の名前が予測可能になります。
ヘッダーファイルの共有: C++関数を含むヘッダーファイルを他のプログラム言語で利用する場合、extern "C" を使って名前マングリングを無効にすると、他の言語で関数を呼び出しやすくなります。
名前マングリングはコンパイラやプラットフォームに依存するため、言語間の相互運用性を確保するためにextern "C" を使用することは一般的なプラクティスです。
C++に戻る