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

鄙人使用的是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.百度知道.

你可能感兴趣的:(c++)