C/C++中什么时候需要使用__stdcall?

本文深入探讨C++中__cdecl与__stdcall两种调用规范的区别,包括参数传递顺序及堆栈清理责任方。解析这两种规范如何影响代码大小及跨语言兼容性,尤其在COM组件与DLL开发中的应用。

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

鄙人使用的是C++,最近在接触到__stdcall这种调用方式,就上网查了一下,结合自己理解,记录下来.

调用方式有不少,如__stdcall,__cdecl,__fastcall…等等.
调用方式主要(不是全部)约定的是两件事情:

1.参数传递的顺序.
2.由调用者还是被调用这来清理堆栈.

这里主要讲一下__stdcall和__cdecl:

__cdecl:这是C/C++函数默认的调用规范,参数从右向左依次传递,压入堆栈,由调用函数负责堆栈的清退。这种方式适用于传递个数可变的参数给被调用内函数,因为只有调用函数才知道它传递了多少个参数给被调函数。如printf函数。

__stdcall:参数从右向左依次传递,并压入堆栈,由被调用函数清退堆栈。该规范生成的函数代码比__cdecl更小.

win32的api都是用__stdcall的方式声明的.

那么,什么时候应该使用__stdcall呢?

1.写com组件时最好使用__stdcall声明.
2.DLL最好也使用__stdcall,因为绝大部分的语言都支持__stdcall方式,所以想要其他语言都能使用该DLL的话,就得使用__stdcall的方式.前面说 的com最好也是用__stdcall的方式定义,也是因为希望能支持其他语言的原因.

写到这里,突然想到以前看过的一个很有趣的例子,一个传参时受调用方式影响的写法:

void func(int a, int b)
{
	cout << "func:\n";
	cout << "a = " << a << "\tb = " << b << endl;
}
int main(void)
{
	int v = 3;
	func(v, v++);
	return 0;
}

大家猜结果是什么?

输出了:
func:
a = 4 b = 3
因为先处理了右边的参数,将v压栈后自加,再处理左边的参数时v已经变成了4.
假如是从左到右的调用方式,结果将会不同.

参考:
1.https://bbs.csdn.net/topics/70441041
2.百度知道.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值