_stdcall_cdecl_fastcall-cc-64位32位-msvcgcc-编译出库的区别
目录
_stdcall、_cdecl、_fastcall c++、c 64位、32位 msvc、gcc 编译出库的区别
一、32位环境下的函数名修饰
(1) MSVC编译器
(2) GCC编译器
二、64位环境下的函数名修饰
(1) MSVC/GCC通用规则
三、关键差异总结
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规则修饰,但调用约定可能影响参数传递。
注意:实际名称可能因编译器版本或选项略有差异,建议通过工具(如objdump或dumpbin)验证具体符号