__stdcall 与 __cdecl

本文详细介绍了_stdcall和_cdecl两种函数调用约定的特点与区别,包括参数入栈顺序、清理方式以及函数名修饰规则等内容,并给出了具体的示例。

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

_stdcall 是StandardCall的缩写,是C++的标准调用方式:所有参数从右到左依次入栈,如果是调用类成员的话,最后一个入栈的是this指针。 这些堆栈中的参数由被调用的函数在返回后清除(也就是自己清除),函数在编译的时候就必须清楚参数个数。

_cdecl 是CDeclaration的缩写,表示C语言默认的函数调用方法:所有参数从右到左依次入栈, 这些参数由调用者清除。被调用者(也就是自己)不需要求调用者传递多少参数。
这类函数类似printf(...);
scanf(...);

两者共通点:

参数都是从右到左依次入栈


名字修饰约定:

1.C编译时函数名修饰约定:

#ifdef __cplusplus
extern "C"
{
#endif
__declspec(dllexport) int __stdcall add(int x,int y)
{
	return x+y;
}
#ifdef __cplusplus
}
#endif
①__stdcall调用约定在输出函数名前加上一个下划线前缀,后面加上一个"@"符号和其参数的字节数,格式为_functionname@number,例如 :function(int a, int b),其修饰名为:_function@8
上例中就为
_add@8

②__cdecl调用约定仅在输出函数名前加上一个下划线前缀,格式为_functionname
上例子就为_add


2.C++编译时函数名修饰约定:

如例子
__declspec(dllexport) void __stdcall add(int x,char y)
{
int s= x+y;
}

__stdcall方式名字为
?add@@YGXHD@Z

__stdcall规则如下:

1.以'?'标识函数的开始
2.函数名后面跟'@@YG'表示参数的开始
3.参数表以代号表示
X--void
D--char
E--unsigned char
H--int
I--unsigned int
J--long
K--unsigned long
M--float
N--double
_N--bool
...

PA--表示指针,后面的代号表示指针类型,如果相同类型的指针后面出现了,以'0'代替,一个'0'代表一次重复

__declspec(dllexport) void __stdcall add(int *x,char *a,int* y)
{

}
就表示为?add@@YGXPAHPAD0@Z
4.参数表的第一项为该函数的返回类型,其后依次为参数的数据类型.
5.参数表后以'@z'标识整个名字的结束,如果函数无参数,则以'Z'结束.(没有参数同void)

如__declspec(dllexport) __stdcall int add()
{
return 1;
}

名字为:?add@@YGHXZ


__cdecl规则如下:

同__stdcall只是只是函数名后面跟'@@YG'变为了@@YA


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值