1
int _cdecl    f (int x) { return 0; }
int _stdcall  f (int y) { return 0; }

名前マングリングの後は次のようになります。

_f
_f@4

これは c で許可されていますか?そうでない場合、なぜですか?

4

2 に答える 2

4

キーワード_cdecland_stdcallは C 言語の一部ではありません。これらは、同様の Borland 拡張機能が先行する Microsoft 拡張機能です。

標準 C 言語では、呼び出し規約を宣言することはできません。_cdecl宣言されたすべての関数は、明らかに、MS コンパイラが " " 規約と呼んでいるものと同等です。

インライン アセンブリを使用して、呼び出し時に 2 つの関数を区別することができます。C のプラットフォーム固有のベンダー拡張を使用しているため、インライン アセンブリの使用を検討できます。

于 2011-05-12T16:46:03.570 に答える
1

まず、それはマングリングではなく、装飾です。C++ は元々、C スタイルのリンク ツールを使用したオーバーロードをサポートするように設計されているため、マングリングは C++ コンパイラで発生するものです。

あなたの質問に関しては、同じ名前の関数を 2 つ持つことはできません。その規則を適用する目的で、装飾されていない名前が使用されます。

これはなぜですか?装飾と呼び出し規約は C 標準の一部ではなく、各コンパイラに固有のものであるためだと思います。複数の呼び出し規則をサポートする C コンパイラが登場したのは、C が発明されてから数年後のことだと確信しています。

于 2011-05-12T16:43:28.467 に答える