文章編號: 100832 - 上次校閱: 2005年12月9日 - 版次: 5.0

32 位元編譯器支援的呼叫慣例的描述

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。
附註Microsoft Visual C++.NET 2002年和 Microsoft Visual C++.NET 2003年支援由 Microsoft.NET Framework 所提供的兩個 Managed 程式碼模型和不受管理的原生 Microsoft Windows 程式碼模型。本文資訊僅適用於不受管理的 Visual C++ 程式碼。

附註Microsoft Visual C++ 2005年支援 Managed 程式碼模型所提供的.NET Framework 以及未受管理的原生 Windows 程式碼模型。
全部展開 | 全部摺疊

結論

Visual C++,32 位元版支援三種呼叫慣例: C (_cdecl)、 標準 (_stdcall) 和 fastcall (_fastcall)。編譯器不支援 Microsoft 編譯器所提供給 MS-DOS 和 16 位元 Windows Pascal 命名法呼叫慣例 (_pascal)。

下表摘要說明呼叫慣例。
                          _cdecl         _stdcall       _fastcall

   -------------------------------------------------------------------
   Arguments              Pushed R to L  Pushed R to L  Note 3
   Stack cleaned up by    Caller         Called         Called
   Naming convention      Prepend "_"    Note 1         Note 2
				
附註 1_stdcall 呼叫慣例會在每個函式名稱裝飾由前面上一個底線字元 (如同 _cdecl 慣例),並附加一個在 @"符號和十進位表示的所需的堆疊空間的位元組數。每個引數擴大為四個位元組的倍數。
附註 2_fastcall 呼叫慣例會在每個函式名稱裝飾可藉由前面上一個 @"符號和附加的正負號和所需的堆疊空間的位元組數之十進位表示。每個引數擴大為四個位元組的倍數。
附註 3第一個需要四個或更少個位元組的兩個函式引數放入暫存器中。呼叫者將從右至左推入至堆疊參數的其餘部分。這種行為可能會在未來版本中變更。
預設呼叫慣例為 _cdecl。如果應用程式宣告函式接受變動數目之引數具有 _fastcall_stdcall 呼叫慣例,編譯器會使用 _cdecl 該函式呼叫慣例。

其他相關資訊

下列程式碼範例說明了程式碼產生在呼叫函式和被呼叫的函式,以支援 C 呼叫慣例。
   int _cdecl CFunc(int a, int b);

      calling function    called function
      -------------------------------------------

      push   b            _CFunc PROC NEAR
      push   a                    .
      call   _CFunc               .
      add    esp,8                .
       .                         RET
       .                  _CFunc ENDP
       .

   int _cdecl CVarFunc(int a, ...);

      calling function    called function
      -------------------------------------------


      push   ...          _CVarFunc PROC NEAR
      push   a                       .
      call   _CVarFunc               .
      add    esp,4+...               .
       .                            RET
       .                  _CVarFunc ENDP
       .
				
下列的程式碼範例說明如何產生在呼叫函式和被呼叫的函式,以支援標準呼叫慣例的程式碼。
   int _stdcall StdFunc(int a, int b);

      calling function    called function
      -------------------------------------------

      push   b            _StdFunc@8 PROC NEAR
      push   a                        .
      call   _StdFunc@8               .
       .                              .
       .                             RET  8
       .                  _StdFunc@8 ENDP
				
下列的程式碼範例說明如何產生在呼叫函式和被呼叫的函式,以支援 fastcall 呼叫慣例的程式碼。
   int _fastcall FastFunc(int a, int b);

      calling function    called function
      -------------------------------------------

      mov edx, b          @FastFunc@8 PROC NEAR
      mov ecx, a                       .
      call @FastFunc@8                 .
       .                               .
       .                              RET 8
       .                  @FastFunc@8 ENDP
				

這篇文章中的資訊適用於:
  • Microsoft Visual C++ 1.0 Professional Edition
  • Microsoft Visual C++ 2.0 Professional Edition
  • Microsoft Visual C++ 4.0 Standard Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Visual C++ 2005 Express Edition
關鍵字:?
kbmt kbhowto kbcompiler kbinfo KB100832 KbMtzh
機器翻譯機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:100832? (http://support.microsoft.com/kb/100832/en-us/ )
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。