MSVC vs GCC/Clang:Windows与Linux开发差异
请对比 MSVC (Visual C++) 与 GCC/Clang 在 C++ 开发中的关键差异,包括 C++ 标准支持、语言扩展(SEH/__declspec/__forceinline)、ABI 不兼容性、以及跨平台兼容注意事项。
回答
孤独的心
MSVC vs GCC/Clang:
1. 标准支持:
- MSVC 历史包袱最重,曾长期不支持完整 C99/C++11。
- 近年 C++17/20 支持追赶,但 Conformance 有差异(如两阶段查找)。
/std:c++20/std:c++latest开关。
2. 编译器扩展:
// MSVC 独有(GCC/Clang 兼容)
__declspec(dllexport/dllimport) // DLL 导入导出
__declspec(align(16)) // 对齐
__declspec(property) // 属性
__forceinline // 强制内联
__try/__except // SEH 结构化异常
// MSVC 默认行为
#pragma pack(push, 1) // 与 GCC __attribute__((packed)) 等效
3. ABI 不兼容:
- name mangling 不同(MSVC 的
?前缀 vs Itanium ABI)。 - struct 布局不同(成员排序、vtable 布局)。
- 异常处理机制不同(MSVC 的 __CxxFrameHandler vs Itanium)。
- DLL 导出需要
__declspec(dllexport)。
4. 跨平台注意事项:
- 使用 CMake 检测平台和编译器。
- 避免
#pragma oncevs#ifndef(两者都支持但 MSVC 对前者有更多问题)。 - 模板实例化范围差异。
- 使用标准库替代 MSVC CRT 函数(
_s后缀安全版本)。