博客日历
2025年07月 | ||||||
一 | 二 | 三 | 四 | 五 | 六 | 七 |
30 | 1 | 2 | 3 | 4 | 5 | 6 |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 | 1 | 2 | 3 |
存档
2025年03月 2024年
03月 04月 05月 2021年
01月 02月 11月 12月 2020年
02月 03月 04月 05月 06月 07月
09月 2018年
09月 2017年
01月 02月 07月 2016年
01月 04月 07月 08月 11月 12月
2015年
01月 02月 03月 05月 09月 10月
11月 2014年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2013年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2012年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2011年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2010年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2009年
03月 04月 05月 06月 07月 08月
09月 10月 11月 12月
VC++中不同的调用约定与编译方式所生成符号的不同
测试所用的源程序a.cpp如下:
//extern "C"
//{
int /*__stdcall*/ foo(int a,int b)
{
return a+b;
}
//}
int main()
{
return 0;
}
1.将源文件当做C语言程序代码编译:
cl a.cpp /TC /Faa.asm
当调用约定为__cdecl时:
_foo
当调用约定为__stdcall时:
_foo@8
当调用约定为__fastcall时:
@foo@8
2.将源文件当做C++语言程序代码编译:
cl a.cpp /TP /Faa.asm
当调用约定为__cdecl时:
?foo@@YAHHH@Z
当调用约定为__stdcall时:
?foo@@YGHHH@Z
当调用约定为__fastcall时:
?foo@@YIHHH@Z
3.将源文件当做C++语言程序代码编译,并加上extern "C"修饰时:
cl a.cpp /TP /Faa.asm
当调用约定为__cdecl时:
_foo
当调用约定为__stdcall时:
_foo@8
当调用约定为__fastcall时:
@foo@8
这说明使用了extern "C"修饰之后,与将源文件当做C语言程序代码编译生成的符号是相同的。
备注:
没有声明调用约定,默认情况下编译器使用__cdecl调用约定,当然也可以使用/Gd,/Gr,/Gz来指定调用约定。
_cdecl :按从右至左的顺序压参数入栈,由调用者把参数弹出栈。由于是调用者负责把参数弹出栈,所以可以给函数定义个数不定的参数,如printf函数。
_stdcall :按从右至左的顺序压参数入栈,由被调用者把参数弹出栈。
_ fastcall :是把函数参数列表的前三个参数放入寄存器eax,edx,ecx,其他参数压栈。
上一篇: 用DPInst.exe/devcon.exe从命令行自动安装驱动程序
下一篇: 驱动编程.1 驱动程序的编译
分类:Win32/C++ 查看次数:6906 发布时间:2009/12/16 10:50:26