extern “C” _cdecl __stdcall
2011-06-29 16:28
92 查看
关于C++动态库导出API相关的这几个关键字,一直困扰了许久,每次在调用C++动态库接口函数的时候,我都不得不花一些时间去“试”。但是用过之后就忘了……
首先解释一下 _cdecl 和 __stdcall所代表的意义:
Cdecl:调用方清理堆栈。这使您能够调用具有 varargs 的函数(如 Printf),使之可用于接受可变数目的参数的方法;
StdCall:被调用方清理堆栈。这是使用平台 invoke 调用非托管函数的默认约定。
我花了一些时间专门对以上这个关键字做了一些测试。结果如下(没有使用def文件):
API函数声明:
导出符号:
?MyMethod@@YAXXZ
API函数声明:
导出符号:
MyMethod
API函数声明:
导出符号:
?MyMethod@@YGXXZ
API函数声明:(这种情况比较特殊)
导出符号:
_MyMethod@0
API函数声明:
导出符号:
?MyMethod@@YAXXZ
API函数声明:
导出符号:
MyMethod
通过以上很容易知道该如何使用API函数声明了。
首先解释一下 _cdecl 和 __stdcall所代表的意义:
Cdecl:调用方清理堆栈。这使您能够调用具有 varargs 的函数(如 Printf),使之可用于接受可变数目的参数的方法;
StdCall:被调用方清理堆栈。这是使用平台 invoke 调用非托管函数的默认约定。
我花了一些时间专门对以上这个关键字做了一些测试。结果如下(没有使用def文件):
API函数声明:
__declspec(dllexport) void MyMethod();
导出符号:
?MyMethod@@YAXXZ
API函数声明:
extern "C" __declspec(dllexport) void MyMethod();
导出符号:
MyMethod
API函数声明:
__declspec(dllexport) void __stdcall MyMethod();
导出符号:
?MyMethod@@YGXXZ
API函数声明:(这种情况比较特殊)
extern "C" __declspec(dllexport) void __stdcall MyMethod();
导出符号:
_MyMethod@0
API函数声明:
__declspec(dllexport) void _cdecl MyMethod()
导出符号:
?MyMethod@@YAXXZ
API函数声明:
extern "C" __declspec(dllexport) void _cdecl MyMethod();
导出符号:
MyMethod
通过以上很容易知道该如何使用API函数声明了。
相关文章推荐
- 总结&备忘:__stdcall,__cdecl,extern "C"
- __stdcall,__cdecl,_cdecl,_stdcall,__fastcall,_fastcall 区别简介 和 extern "C" 的作用
- C/C++中函数的调用约定(__cdecl, __stdcall)以及extern, extern “C"的详细解释
- cdecl、stdcall、fastcall、declspec 、extern "c"
- _stdcall,_cdecl与extern "C"
- 调用约定(__stdcall and __cdecl)和修饰名(extern c)
- _stdcall,_cdecl与extern "C"
- _cdecl 与 _stdcall 和 extern 与 extern "C" 解释与理解
- 编写和使用DLL时,常用的关键字 extern "C",__declspec,__cdecl,__stdcall
- _stdcall和_cdecl,extern “C”的联系
- 函数调用的区别:_cdecl以及_stdcall
- cdecl、stdcall、fastcall函数调用约定区别
- _stdcall和_cdecl的区别
- __stdcall 与 __cdecl
- WINBASEAPI 与WINAPI(__stdcall __cdecl)的区别
- __stdcall,__cdecl,__fastcall
- __cdecl __fastcall与 __stdcall
- _stdcall,_cdecl区别
- 函数的__cdecl、__stdcall、__fastcall、__thiscall、naked call介绍
- __declspec,__cdecl,__stdcall用处