int _cdecl f (int x) { return 0; }
int _stdcall f (int y) { return 0; }
名前マングリングの後は次のようになります。
_f
_f@4
これは c で許可されていますか?そうでない場合、なぜですか?
int _cdecl f (int x) { return 0; }
int _stdcall f (int y) { return 0; }
名前マングリングの後は次のようになります。
_f
_f@4
これは c で許可されていますか?そうでない場合、なぜですか?
キーワード_cdecl
and_stdcall
は C 言語の一部ではありません。これらは、同様の Borland 拡張機能が先行する Microsoft 拡張機能です。
標準 C 言語では、呼び出し規約を宣言することはできません。_cdecl
宣言されたすべての関数は、明らかに、MS コンパイラが " " 規約と呼んでいるものと同等です。
インライン アセンブリを使用して、呼び出し時に 2 つの関数を区別することができます。C のプラットフォーム固有のベンダー拡張を使用しているため、インライン アセンブリの使用を検討できます。
まず、それはマングリングではなく、装飾です。C++ は元々、C スタイルのリンク ツールを使用したオーバーロードをサポートするように設計されているため、マングリングは C++ コンパイラで発生するものです。
あなたの質問に関しては、同じ名前の関数を 2 つ持つことはできません。その規則を適用する目的で、装飾されていない名前が使用されます。
これはなぜですか?装飾と呼び出し規約は C 標準の一部ではなく、各コンパイラに固有のものであるためだと思います。複数の呼び出し規則をサポートする C コンパイラが登場したのは、C が発明されてから数年後のことだと確信しています。