C/C++函数调用的几种方式

介绍了Visual C/C++编译器调用内部和外部函数的几种方式。解释了不同调用约定的差异,如__cdecl是C和C++程序默认调用约定,由调用者清理栈,可处理可变参数函数;__fastcall约定尽可能通过寄存器传递函数参数。了解这些有助于调试程序和代码链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CA笔试考题,MS面试vender考题,可惜我一次都没做出来:(

The Visual C/C++ compiler provides several ways to call internal and external functions. Understanding these different approaches can help you debug your program and link your code with assembly-language routines.
The following will explain the differences between the calling conventions, how arguments are passed, and how values are returned by functions.

__cdecl:
 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 __stdcall, because it requires each function call to include stack cleanup code.

ElementImplementation
Argument-passing orderRight to left
Stack-maintenance responsibilityCalling function pops the arguments from the stack
Name-decoration conventionUnderscore character (_) is prefixed to names
Case-translation conventionNo case translation performed

__stdcall:

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.
ElementImplementation
Argument-passing orderRight to left.
Argument-passing conventionBy value, unless a pointer or reference type is passed.
Stack-maintenance responsibilityCalled function pops its own arguments from the stack.
Name-decoration conventionAn 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 conventionNone

__fastcall:

The __fastcall calling convention specifies that arguments to functions are to be passed in registers, when possible.

ElementImplementation
Argument-passing orderThe first two DWORD or smaller arguments are passed in ECX and EDX registers; all other arguments are passed right to left.
Stack-maintenance responsibilityCalled function pops the arguments from the stack.
Name-decoration conventionAt 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 conventionNo case translation performed.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值