名前の装飾

名前の装飾は、通常は C++ の名前付け規則を指しますが、C の場合でもよく適用されます。 既定では、C++ では関数名、パラメーター、および戻り値の型を使用して、関数のリンカー名が作成されます。 次の関数宣言について考えてみます。

void CALLTYPE test(void);

次の表は、さまざまな呼び出し規約のリンカー名を示します。

呼び出し規約 extern "C" または .c ファイル .cpp.cxx、または /TP
C の名前付け規則 (__cdecl) _test ?test@@ZAXXZ
Fast call 名前付け規則 (__fastcall) @test@0 ?test@@YIXXZ
Standard call 名前付け規則 (__stdcall) _test@0 ?test@@YGXXZ
Vector call 名前付け規則 (__vectorcall) test@@0 ?test@@YQXXZ

C++ から C の関数を呼び出すには、extern "C" を使用します。 extern "C" は、クラスに属さない C++ の関数に対して、C の名前付け規則の使用を強制します。 コンパイラ スイッチ /Tc または /Tp に注意してください。これらは、ファイル名の拡張子を無視し、ファイルをそれぞれ C または C++ としてコンパイルするように指示します。 これらのオプションを使用すると、予期しないリンカー名が発生する可能性があります。

関数プロトタイプのパラメーターが一致していないと、このエラーが発生します。 名前の装飾では、関数のパラメーターを最終の装飾関数名に組み込みます。 関数宣言でのパラメーターと一致していない関数を呼び出すと、LNK2001 が発生することがあります。

現在では、コンパイラ販売元間またはコンパイラのバージョン間でさえも、C++ の名前付けの規則が確立されていません。 別のコンパイラによってコンパイルされたオブジェクト ファイルをリンクすると、名前付け方式が異なり、外部参照が未解決になる可能性があります。

関連項目

リンカー ツール エラー LNK2001