27
2012
02

__stdcall和cdecl调用约定

C/C++编程时,常会看到调用约定的修饰,主要有__stdcall和__cdecl两种:

__stdcall或者Pascal调用约定

__stdcall或者Pascal也被称做是标准的调用约定,即这些函数将在返回到调用者之间将参数从栈中删除。所有的Win32 API函数,除了那些带有变参的外,使用的都是这种调用方式。Microsoft平台上的COM接口所提供的所有函数使用的均是标准的调用约定。参数数目可变的函数使用的则是C调用约定。

stdcall的调用约定意味着:1)参数从右向左压入堆栈,2)函数自身修改堆栈 3)函数名自动加前导的下划线,后面紧跟一个@符号,其后紧跟着参数的尺寸

cdecl调用约定

又称为C调用约定,是C语言缺省的调用约定,带有变参的函数所用的仍然是C调用约定,即__cdecl。 由于参数按照从右向左顺序压栈,因此最开始的参数在最接近栈顶的位置,因此当采用不定个数参数时,第一个参数在栈中的位置肯定能知道,只要不定的参数个数能够根据第一个后者后续的明确的参数确定下来,就可以使用不定参数,例如对于CRT中的sprintf函数,定义为:

int sprintf(char* buffer,const char* format,...)

由于所有的不定参数都可以通过format确定,因此使用不定个数的参数是没有问题的。

详情见《Com技术内幕微软组件对象模型》P17

C调用约定是由调用者来维护堆栈。由调用者把参数弹出栈。对于传送参数的内存栈是由调用者来维护的(正因为如此,实现可变参数的函数只能使用该调用约定)

大多数语言(除C/C++)一般都使用标准调用约定,所以一般情况下最好使用标准调用约定,除非需要实现变参才需要使用C调用约定。《COM原理与应用P28》

« 上一篇下一篇 »

相关文章:

将C++视为一个组合语言  (2012-2-27 0:18:28)

VS2008非托管c++访问webservice服务  (2011-6-22 0:12:7)

从C++到Java,10年技术生涯的几点思考  (2011-4-20 19:56:27)

c++经典面试题(一)  (2008-11-23 17:42:53)

c++经典面试题  (2008-11-23 17:32:25)

瑞星面试  (2008-11-23 17:24:21)

《C++高效编程》学习笔记  (2008-11-23 17:19:35)

数据类型转换:static_cast,const_cast等用法  (2008-11-23 17:14:20)

解读求π的怪异代码,只用三行算出800位  (2008-10-21 23:25:22)

JAVA和C++的区别  (2008-10-18 16:36:11)

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。