2017-07-06 1 views
4

Nach meinem Verständnis wird Name Mangling verwendet, wenn eine Funktion überladen wird, so dass die Funktionen mit dem gleichen Namen unterschieden werden können.Warum wird Name Mangling mit der Funktion WinMain() verwendet?

Aber ich habe festgestellt, dass Name Mangling auch mit der WinMain() Funktion verwendet wird (die nicht überlastet ist). Nach dem Namen Mangling wird es [email protected].

Warum wird Name Mangling mit der WinMain() Funktion verwendet?


Dies ist der Code, den ich verwendet:

#include <windows.h> 

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

    return 0; 
} 
+1

enthalten Wenn der Compiler tatsächlich * das 'WinMain' Symbol * beschädigte, würde es etwas völlig verschieden von, was Sie sehen. Was Sie sehen, ist der Compiler mit * special treatment * des 'WinMain'-Symbols. –

+0

Ich glaube '_WinMain @ 16' ist ein interner Name, der vom mingw/gcc-Compiler verwendet wird. Was die 16 bedeuten soll, habe ich keine Ahnung. – Lundin

+2

@Lundin das '@' bedeutet 'stdcall' Aufrufkonvention, die' 16' ist die Größe der Parameterliste (hier: 4 mal ein 4 Byte Argument). Funktionen, die andere Aufrufkonventionen verwenden, sind anders gestaltet. –

Antwort

7

Dies ist nicht, was man gemeinhin Namen Mangeln genannt wird. Der Name Mangling ist für C++, um aus gleichnamigen Funktionen ausgezeichnete Symbolnamen zu erzeugen (und ist leider Implementierung definiert). Hier haben Sie eine einfache "decorated name" durch die Konventionen von win32 ABI. Windows verwendet sie, um verschiedene auf dieser Plattform verfügbare Aufrufkonventionen zu unterscheiden.

In diesem Fall bezeichnet der einzelne @ die stdcall Aufrufkonvention und die folgende Zahl ist die Anzahl der Bytes in der Argumentliste. Das WINAPI-Makro wird zu einem bestimmten Compiler-spezifischen Attribut erweitert, das stdcall als die Aufrufkonvention auswählt.

Verschiedene ABIs verwenden unterschiedliche Namensdekorationen. Z.B. Unter Linux lautet Ihre Standard-Aufrufkonvention cdecl und sie verwendet keinerlei Dekoration. Aber Sie könnten Dekorationen haben, die eine Symbolversion (zufällig nach einem @ Zeichen)

+0

* "In diesem Fall bezeichnet die einzelne @ die Aufrufkonvention stdcall" * Es ist nicht nur das @, das die Aufrufkonventionen von stdcall bezeichnet (weil die Fast Call-Konvention auch das @ verwendet). Was die stdcall-Aufrufkonvention bezeichnet, ist der führende Unterstrich und das @ und die Zahl nach dem @, die die Anzahl der Bytes für die Parameter darstellt. – James

Verwandte Themen