_cdecl 是CDeclaration的缩写,表示C语言默认的函数调用方法:所有参数从右到左依次入栈, 这些参数由调用者清除。被调用者(也就是自己)不需要求调用者传递多少参数。
这类函数类似printf(...);
scanf(...);
两者共通点:
参数都是从右到左依次入栈
名字修饰约定:
1.C编译时函数名修饰约定:
#ifdef __cplusplus
extern "C"
{
#endif
__declspec(dllexport) int __stdcall add(int x,int y)
{
return x+y;
}
#ifdef __cplusplus
}
#endif
①__stdcall调用约定在输出函数名前加上一个下划线前缀,后面加上一个"@"符号和其参数的字节数,格式为_functionname@number,例如 :function(int a, int b),其修饰名为:_function@8
上例中就为
_add@8
②__cdecl调用约定仅在输出函数名前加上一个下划线前缀,格式为_functionname
上例子就为_add
2.C++编译时函数名修饰约定:
如例子
__declspec(dllexport) void __stdcall add(int x,char y)
{
int s= x+y;
}
__stdcall方式名字为
?add@@YGXHD@Z
①__stdcall规则如下:
1.以'?'标识函数的开始
2.函数名后面跟'@@YG'表示参数的开始
3.参数表以代号表示
X--void
D--char
E--unsigned char
H--int
I--unsigned int
J--long
K--unsigned long
M--float
N--double
_N--bool
...
PA--表示指针,后面的代号表示指针类型,如果相同类型的指针后面出现了,以'0'代替,一个'0'代表一次重复
如
__declspec(dllexport) void __stdcall add(int *x,char *a,int* y)
{
}
就表示为?add@@YGXPAHPAD0@Z
4.参数表的第一项为该函数的返回类型,其后依次为参数的数据类型.
5.参数表后以'@z'标识整个名字的结束,如果函数无参数,则以'Z'结束.(没有参数同void)
如__declspec(dllexport) __stdcall int add()
{
return 1;
}
名字为:?add@@YGHXZ
②__cdecl规则如下:
同__stdcall只是只是函数名后面跟'@@YG'变为了@@YA