Share via


/Gd, /Gr, /Gz   (Calling Convention)

OverviewHow Do ICompiler Options

The calling convention options determine the order in which arguments passed to functions are pushed onto the stack; which function, calling or called, removes the arguments from the stack; and the name-decorating convention that the compiler uses to identify individual functions. (To find the Calling Convention options in the development environment, click Settings on the Project menu. Then click the C/C++ tab, and click Code Generation in the Category box.)

Command Line Project Settings Description
/Gd __cdecl Specifies the C calling convention for all functions that are not C++ member functions or are not marked as __stdcall or __fastcall. This is the default setting.
/Gr __fastcall Specifies the __fastcall calling convention for all functions that are not C++ member functions or are not marked as __cdecl or __stdcall. All __fastcall functions must have prototypes.
/Gz __stdcall Specifies the __stdcall calling convention for all prototyped C functions that do not take a variable number of arguments and are not marked as __cdecl or __fastcall. All __stdcall functions must have prototypes.

Note   **x86 Specific —>**By default, C++ member functions use a calling convention in cases where the member function’s this pointer is passed in the ECX register. All other arguments are pushed onto the stack from right to left, and the called routine pops the member function’s arguments from the stack. END x86 Specific   A member function that is explicitly marked as __cdecl, __fastcall, or __stdcall uses the specified calling convention. A member function that takes a variable number of arguments always uses the __cdecl calling convention.

__cdecl Specifics

For C, the __cdecl naming convention uses the function name preceded by an underscore ( _ );  no case translation is performed. Unless declared as extern "C", C++ functions use a different name-decorating scheme. For more information on decorated names, see Decorated Names.

__fastcall Specifics

Some of a __fastcall function’s arguments are passed in registers x86 Specific —> ECX and EDX END x86 Specific, and the rest are pushed onto the stack from right to left. The called routine pops these arguments from the stack before it returns. Typically, /Gr decreases execution time.

Important   Be careful when using the __fastcall calling convention for any function written in inline assembly language. Your use of registers could conflict with the compiler’s use.

For C, the __fastcall naming convention uses the function name preceded by an at sign (@) followed by the size of the function’s arguments in bytes. No case translation is done. The compiler uses the following template for the naming convention:

@function_name@number

Note   Microsoft does not guarantee the same implementation of the __fastcall calling convention between compiler releases. For example, the implementation differs between the 16-bit and 32-bit compilers.

When using the __fastcall naming convention, use the standard include files. Otherwise, you will get unresolved external references.

__stdcall Specifics

A __stdcall function’s arguments are pushed onto the stack from right to left, and the called function pops these arguments from the stack before it returns.

For C, the __stdcall naming convention uses the function name preceded by an underscore ( _ ) and followed by an at sign (@) and the size of the function’s arguments in bytes. No case translation is performed. The compiler uses the following template for the naming convention:

_functionname@number

**x86 Specific —>**This option has no effect on the name decoration of C++ methods and functions. Unless declared as extern "C", C++ methods and functions use a different name-decorating scheme. For more information on decorated names, see Decorated Names. END x86 Specific