__cdecl
Microsoft 專有的
此為預設呼叫慣例為 c 和 C++ 程式。 由呼叫端會清除堆疊,因為其實一點都不 vararg 函式。 __cdecl呼叫慣例會建立較大的可執行檔比 __stdcall,因為它不需要包含堆疊清除程式碼的每一個函式呼叫。 下列清單會顯示這個呼叫慣例的實作。
項目 |
實作 |
---|---|
傳遞引數的順序 |
由右至左 |
堆疊維護責任 |
呼叫函式會出現的引數由堆疊 |
名稱裝飾慣例 |
底線字元 (_) 有前置名稱,除了匯出 __cdecl 運作,使用 c 連結時。 |
大小寫轉譯慣例 |
執行不區分大小的轉譯 |
注意事項 |
---|
如需相關資訊,請參閱裝飾名稱。 |
在 Itanium 處理器系列 (IPF) 和 x64 處理器, __cdecl加以接受並由編譯器 ; 略過 在 IPF,依照慣例,傳遞參數暫存器中。
放置 __cdecl變數或函數名稱之前的修飾詞。 因為 c 命名和呼叫慣例是預設值,唯一的時候您需要使用 __cdecl時,您已指定 /Gz (服務繼續操作) 或 /Gr (fastcall) 編譯器選項。 /Gd 編譯器選項的軍隊__cdecl呼叫慣例。
對於非靜態類別的函式,函式是定義的出行,如果呼叫慣例修飾詞並沒有指定行超出定義上。 也就是類別的非靜態成員方法,在宣告期間指定的呼叫慣例會假設為定義點。 此類別定義中,
struct CMyClass {
void __cdecl mymethod();
};
this
void CMyClass::mymethod() { return; }
這等於是
void __cdecl CMyClass::mymethod() { return; }
範例
在下列範例中,編譯器只須使用命名和呼叫慣例為 c system函式:
// Example of the __cdecl keyword on function
int __cdecl system(const char *);
// Example of the __cdecl keyword on function pointer
typedef BOOL (__cdecl *funcname_ptr)(void * arg1, const char * arg2, DWORD flags, ...);