分类: C/C++
2006-11-21 09:55:05
This is the default calling convention for C and C++ programs. Because the stack is cleaned up by the caller, it can do vararg functions. The __cdecl calling convention creates larger executables than , because it requires each function call to include stack cleanup code. The following list shows the implementation of this calling convention.
Element | Implementation |
Argument-passing order | Right to left |
Stack-maintenance responsibility | Calling function pops the arguments from the stack |
Name-decoration convention | Underscore character (_) is prefixed to names |
Case-translation convention | No case translation performed |
Place the __cdecl modifier before a variable or a function name. Because the C naming and calling conventions are the default, the only time you need to use __cdecl is when you have specified the /Gz (stdcall) or /Gr (fastcall) compiler option. The compiler option forces the __cdecl calling convention
The __stdcall calling convention is used to call Win32 API functions. The callee cleans the stack, so the compiler makes vararg functions __cdecl. Functions that use this calling convention require a function prototype. The following list shows the implementation of this calling convention.
Element | Implementation |
Argument-passing order | Right to left. |
Argument-passing convention | By value, unless a pointer or reference type is passed. |
Stack-maintenance responsibility | Called function pops its own arguments from the stack. |
Name-decoration convention | An underscore (_) is prefixed to the name.
The name is followed by the at sign (@) followed by the number of bytes (in
decimal) in the argument list. Therefore, the function declared as int
func( int a, double b ) is decorated as follows:
_func@12 |
Case-translation convention | None |
The compiler option specifies __stdcall for all functions not explicitly declared with a different calling convention.
(3) __fastcall
The __fastcall calling convention specifies that arguments to functions are to be passed in registers, when possible. The following list shows the implementation of this calling convention.
Element | Implementation |
Argument-passing order | The first two DWORD or smaller arguments are passed in ECX and EDX registers; all other arguments are passed right to left. |
Stack-maintenance responsibility | Called function pops the arguments from the stack. |
Name-decoration convention | At sign (@) is prefixed to names; an at sign followed by the number of bytes (in decimal) in the parameter list is suffixed to names. |
Case-translation convention | No case translation performed. |
Note Future compiler versions may use different registers to store parameters.
Using the compiler option causes each function in the module to compile as fastcall unless the function is declared with a conflicting attribute, or the name of the function is main.