__stdcall,__fastcall,__cdecl等函数说明符详解

原创 2007年09月24日 10:47:00

__stdcall,__fastcall,__cdecl用于确定以下三方面函数调用信息:

1。将函数参数推送到堆栈上的顺序。
2。是由调用方函数还是由被调用函数在调用结束时从堆栈中移除参数。
3。编译器用来标识各个函数的名称修饰约定。

 


__cdecl 细节
对于 C,__cdecl 命名约定使用以下划线 ( _ ) 开头的函数名;不执行任何大小写转换。除非声明为 extern "C",否则 C++ 函数将使用不同的名称修饰方案。有关更多信息,请参阅修饰名。

__fastcall 细节
某些 __fastcall 函数参数在寄存器 x86 Specific —> ECX 和 EDX END x86 Specific 中传递,其余参数则被从右到左推送到堆栈上。被调用例程在返回之前从堆栈中弹出这些参数。/Gr 通常减少执行时间。

注意 在对用内联程序集语言编写的任意函数使用 __fastcall 调用约定时,一定要小心。您对寄存器的使用可能与编译器对它们的使用发生冲突。
对于 C,__fastcall 命名约定使用以“at”符 (@) 开头的函数名,后跟函数参数大小(以字节为单位)。不执行任何大小写转换。编译器使用下列命名约定模板:

@function_name@number
注意 Microsoft 不保证不同编译器版本之间的 __fastcall 调用约定的实现相同。例如,16 位编译器与 32 位编译器的实现就不同。
当使用 __fastcall 命名约定时,请使用标准包含文件。否则将获取无法解析的外部引用。

__stdcall 细节
__stdcall 函数的参数被从右到左推送到堆栈上,被调用函数在返回之前从堆栈中弹出这些参数。

对于 C,__stdcall 命名约定使用以下划线 ( _ ) 开头的函数名,后跟“at”符 (@) 和函数参数大小(以字节为单位)。不执行任何大小写转换。编译器使用下列命名约定模板:

_functionname@number
x86 Specific—>

此选项对 C++ 方法和函数的名称修饰无效。除非声明为 extern "C",否则 C++ 方法和函数将使用不同的名称修饰方案。有关更多信息,请参阅修饰名。

 

C 和 C++ 程序中的函数在内部通过其修饰名加以识别。修饰名是在编译函数定义或函数原型期间由编译器创建的字符串。

当指定 LINK 或其他工具的函数名时,有时需要修饰名。对于需要修饰名的情况,请参考正在使用的工具的文档,获取详细信息。


使用修饰名
修饰名 | C++ 修饰名的格式和 C 修饰名的格式
大多数情况下,无需知道函数的修饰名。LINK 和其他工具通常可以处理未修饰形式的名称。

但是,某些情况要求指定修饰形式的名称。必须指定重载的 C++ 函数和特殊成员函数(如构造函数和析构函数)的修饰名,以使 LINK 和其他工具可以与该名称匹配。在引用 C 或 C++ 函数名的程序集源文件中也必须使用修饰名。

警告 如果更改函数名、类、调用约定、返回类型或任何参数,修饰名不再有效。必须获取函数名的新版本并在所有指定了修饰名的位置使用。

 

查看修饰名请参见
修饰名
编译包含函数定义或函数原型的源文件之后,可以获取函数名的修饰形式。若要在程序中检查修饰名,请执行下列操作之一:

1.使用列表
2.使用 DUMPBIN 工具

可以使用 undname.exe 将修饰名转换为未修饰形式。例如,

C:/>undname ?func1@a@@AAEXH@Z
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation 1981-2000. All rights reserved.Undecoration
of :- "?func1@a@@AAEXH@Z"
is :- "private: void __thiscall a::func1(int)"
 

相关文章推荐

函数调用约定 : _stdcall _cdecl fastcall 调用方式详解

在C语言中,假设我们有这样的一个函数:int function(int a,int b)调用时只要用result = function(1,2)这样的方式就可以使用这个函数。但是,当高级语言被编译成计...

cdecl、stdcall、fastcall函数调用约定区别

在C语言中,假设我们有这样的一个函数:      int function(int a,int b)      调用时只要用result = function(1,2)这样的方式就可以使用这个...
  • dqjyong
  • dqjyong
  • 2012年09月26日 17:45
  • 838

用__declspec,__cdecl,__fastcall,__stdcall等关键字修饰的函数的参数压栈方式

文章转载至:http://blog.csdn.net/feixiaoxing/article/details/7521004 在编译器编译文件的时候,软件会根据程序本身的要求对函数作不同的压栈处理。...

C/C++ 函数调用约定(__cdecl、__stdcall、__fastcall)

调用函数时,计算机常用栈来存放函数执行需要的参数,由于栈的空间大小是有限的,在windows下,栈是向低地址扩展的数据结构,是一块连续的内存区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好...

函数调用约定:__cdecl,__stdcall,__fastcall,__thiscall

1. __stdcall调用 __stdcall 是Standard Call的缩写,是C++的标准调用方式,也是Pascal程序的缺省调用方式,参数采用从右到左的压栈方式,如果是调用类成员的话...

函数的调用约定(_cdecl,_stdcall,_fastcall,_pascal)

microsoft的vc默认的是__cdecl方式,而windows API则是__stdcall,如果用vc开发dll给其他语言用,则应该指定__stdcall方式。堆栈由谁清除这个很重要,如果是要...

汇编学习第五课之函数调用约定:cdecl,stdcall,fastcall

1. 函数调用约定介绍函数调用约定(Calling Convention),是一个重要的基础概念,它规定了程序执行过程中函数的调用者(caller)和被调用这(callee)之间如何传递参数以及如何恢...

【C++】__stdcall,__cdecl和__fastcall的作用 函数调用规范_空...

__stdcall,__cdecl和__fastcall的作用 1)调用约定 被以下几个修饰关键字修饰的函数,其参数都是从右向左通过堆栈传递的(__fastcall的前面部分由ecx,edx传...
  • zacklin
  • zacklin
  • 2012年03月23日 17:41
  • 378

cdecl、stdcall、fastcall函数调用约定区别

论函数调用约定   在C语言中,假设我们有这样的一个函数:      int function(int a,int b)      调用时只要用result = functi...

C++中_cdecl _stdcall _fastcall _thiscall函数调用总结(对照汇编代码)

首先,我们要学会在Visual Studio 2008中学会查看C++代码对应的汇编代码。给程序添加断点并开始调试程序后,对文件中间右键=》转到反汇编,即可看到汇编代码。 汇编代码用//注释,说明用/...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:__stdcall,__fastcall,__cdecl等函数说明符详解
举报原因:
原因补充:

(最多只允许输入30个字)