名前の装飾
名前の装飾は、通常は 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++ の名前付けの規則が確立されていません。 別のコンパイラによってコンパイルされたオブジェクト ファイルをリンクすると、名前付け方式が異なり、外部参照が未解決になる可能性があります。
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示