2017-07-06 8 views
4

私の理解に基づいて、名前のマングリングは関数のオーバーロードがあるときに使用されるので、同じ名前の関数を区別することができます。WinMain()関数で名前マングリングを使用するのはなぜですか?

しかし、私は名前のマングリングもWinMain()関数(オーバーロードされていない)で使用されていることに気付きました。名前マングリングの後、それは[email protected]になります。

なぜ、WinMain()機能で名前のマングリングが使用されるのですか?


これは私が使用するコードです:

#include <windows.h> 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, int nCmdShow) 
{ 

    return 0; 
} 
+1

コンパイラが実際に 'WinMain'シンボルをmangleした場合、表示されるものとはまったく異なるものになります。あなたが見ているのは、 'WinMain'シンボルの*特別扱い*を持つコンパイラです。 –

+0

私は '_WinMain @ 16'はmingw/gccコンパイラが使う内部名だと思います。 16とはどういう意味ですか、私には分かりません。 – Lundin

+2

'@ 'は' stdcall'呼び出し規約を意味し、 '16'はパラメータリストのサイズです(ここでは4バイトの4バイト引数です)。他の呼び出し規約を使用する関数は、異なる方法で装飾されています。 –

答えて

7

これは、一般的にをマングリング名前を呼ばれているものではありません。名前マングリングは、C++が同じ名前の関数から識別されたシンボル名を作成することです(そして残念ながら実装定義されています)。ここでは、win32 ABIの規則によって単純な"decorated name"があります。 Windowsはそれらを使用して、そのプラットフォームで利用可能なさまざまな呼び出し規約を区別します。

この場合、単一の@stdcall呼び出し規約を示し、続く数字は引数リストのバイト数です。 WINAPIマクロは、呼び出し規約としてstdcallを選択するコンパイラ固有の属性に展開されます。

異なるABIは、異なる名前の装飾を使用します。例えば。 Linuxでは、標準の呼び出し規約はcdeclであり、デコレーションはまったく使用されません。しかし、シンボルバージョン(偶然、@符号の後に)を含む装飾を持つことができます。

+0

* "この場合、単一の@はstdcallの呼び出し規約を示します" * @は、stdcallの呼び出し規則を示しているだけではありません(ファストコール呼び出し規則も@を使用するためです)。 stdcallの呼び出し規約を示すものは先頭のアンダースコアで、@と@の後の数字はパラメータのバイト数を表します。 – James

関連する問題