2017-07-06 58 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'符號,它將會是你看到的完全不同的東西。你看到的是編譯器對WinMain符號有特殊的處理。 –

+0

我相信'_WinMain @ 16'是mingw/gcc編譯器使用的一些內部名稱。 16這應該是什麼意思,我不知道。 – Lundin

+2

@Lundin @代表'stdcall'調用約定,'16'代表參數列表的大小(這裏是4個字節的參數的4倍)。使用其他調用約定的函數的裝飾不同。 –

回答

7

這不是什麼俗稱名字改編。名稱修飾用於C++從具有相同名稱的函數中創建可區分的符號名稱(不幸的是實現定義)。在這裏,您可以通過win32 ABI的約定獲得簡單的"decorated name"。 Windows使用它們來分析該平臺上可用的不同調用約定。

在這種情況下,單個@表示stdcall調用約定,後面的數字是參數列表中的字節數。宏WINAPI擴展爲一些編譯器特定的屬性,選擇stdcall作爲調用約定。

不同的ABI使用不同的名稱裝飾。例如。在Linux上,您的標準調用約定是cdecl,它根本不使用任何裝飾。但你可以裝飾包含一個符號版本(巧合後在@符號)

+0

*「在這種情況下,單個@表示stdcall調用約定」*它不僅表示stdcall調用約定(因爲快速調用約定也使用@)。什麼表示stdcall調用約定是前導下劃線和@以及@之後的數字,表示參數的字節數。 – James

相關問題