You are currently offline, waiting for your internet to reconnect

Description of the calling conventions that the 32-bit compiler supports

This article was previously published under Q100832
This article has been archived. It is offered "as is" and will no longer be updated.
Note Microsoft Visual C++ .NET 2002 and Microsoft Visual C++ .NET 2003 support both the managed code model that is provided by the Microsoft .NET Framework and the unmanaged native Microsoft Windows code model. The information in this article applies only to unmanaged Visual C++ code.

Note Microsoft Visual C++ 2005 supports both the managed code model that is provided by the .NET Framework and the unmanaged native Windows code model.
SUMMARY
Visual C++, 32-bit Edition, supports three calling conventions: C (_cdecl), standard (_stdcall), and fastcall (_fastcall). The compiler does not support the Pascal calling convention (_pascal) provided by Microsoft compilers for MS-DOS and 16-bit Windows.

The following table summarizes the calling conventions.
                          _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				
Note 1 The _stdcall calling convention decorates each function name by prepending an underscore character (as the _cdecl convention does) and appending an at sign "@" and the decimal representation of the number of bytes of stack space required. Each argument is widened to a multiple of four bytes.
Note 2 The _fastcall calling convention decorates each function name by prepending an at sign "@" and appending an at sign and the decimal representation of the number of bytes of stack space required. Each argument is widened to a multiple of four bytes.
Note 3 The first two function arguments that require four or fewer bytes are placed into registers. The caller pushes the remainder of the parameters onto the stack from right to left. This behavior may change in future versions.
The default calling convention is _cdecl. If an application declares a function that accepts a variable number of arguments with the _fastcall or _stdcall calling convention, the compiler uses the _cdecl calling convention for that function.
MORE INFORMATION
The following code examples illustrate the code generated in the calling function and in the called function to support the C calling convention.
   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       .				
The following code example illustrates the code generated in the calling function and in the called function to support the standard calling convention.
   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				
The following code example illustrates the code generated in the calling function and in the called function to support the fastcall calling convention.
   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				
Properties

Article ID: 100832 - Last Review: 02/28/2014 07:53:03 - Revision: 5.0

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

  • kbnosurvey kbarchive kbhowto kbinfo kbcompiler KB100832
Feedback