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

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

‌(1) MSVC编译器
_stdcall、_cdecl、_fastcall c++、c 64位、32位 msvc、gcc 编译出库的区别_第1张图片
‌(2) GCC编译器
_stdcall、_cdecl、_fastcall c++、c 64位、32位 msvc、gcc 编译出库的区别_第2张图片
_stdcall、_cdecl、_fastcall c++、c 64位、32位 msvc、gcc 编译出库的区别_第3张图片

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

‌(1) MSVC/GCC通用规则
_stdcall、_cdecl、_fastcall c++、c 64位、32位 msvc、gcc 编译出库的区别_第4张图片

‌三、关键差异总结‌

‌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规则修饰,但调用约定可能影响参数传递‌。
_stdcall、_cdecl、_fastcall c++、c 64位、32位 msvc、gcc 编译出库的区别_第5张图片
‌注意‌:实际名称可能因编译器版本或选项略有差异,建议通过工具(如objdump或dumpbin)验证具体符号‌

你可能感兴趣的:(c/c++,c++,c语言)