测试所用的源程序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,其他参数压栈。


本文链接地址: VC++中不同的调用约定与编译方式所生成符号的不同
https://blog.qingfengju.com/index.asp?id=184

上一篇: 用DPInst.exe/devcon.exe从命令行自动安装驱动程序
下一篇: 驱动编程.1 驱动程序的编译

分类:Win32/C++ 查看次数:6906 发布时间:2009/12/16 10:50:26