目录

_stdcall_cdecl_fastcall-cc-64位32位-msvcgcc-编译出库的区别

_stdcall、_cdecl、_fastcall c++、c 64位、32位 msvc、gcc 编译出库的区别

一、32位环境下的函数名修饰‌

‌(1) MSVC编译器

https://i-blog.csdnimg.cn/direct/28515f710bf84cc5bb927afafb98053d.png

‌(2) GCC编译器

https://i-blog.csdnimg.cn/direct/8aa537dd4b7443d7a7ebcd93920ee0b6.png

https://i-blog.csdnimg.cn/direct/4f1ec701c5064b518b8e7834e59c7ffd.png

‌二、64位环境下的函数名修饰‌

‌(1) MSVC/GCC通用规则

https://i-blog.csdnimg.cn/direct/a6371056b4e1471c8ec973732a7ce8bc.png

‌三、关键差异总结‌

‌1. 32位与64位‌:

32位严格区分调用约定,名称修饰包含调用约定标识(如@4、@@YG)‌;

64位调用约定被忽略,名称修饰不体现调用约定信息‌。

‌2. MSVC与GCC‌:

MSVC的C++名称修饰包含调用约定标识(如@@YG、@@YI),GCC采用Itanium ABI规则(如_Z4funci)‌;

GCC对_stdcall和_fastcall的支持可能不严格,尤其在C语言中‌4。

‌3. C与C++‌:

C语言名称修饰简单(前缀或后缀),C++包含参数类型编码和调用约定标识(32位);

使用extern “C"时,C++函数名按C规则修饰,但调用约定可能影响参数传递‌。

https://i-blog.csdnimg.cn/direct/392cd97523b94947a34749334f305dc4.png

‌注意‌:实际名称可能因编译器版本或选项略有差异,建议通过工具(如objdump或dumpbin)验证具体符号‌