__attribute__和__declspec是C++中用于控制编译器行为的扩展关键字,分别用于GCC/Clang和MSVC编译器。__attribute__支持format、unused、deprecated、aligned、visibility等功能;__declspec提供dllexport、dllimport、deprecated、align等对应特性。为实现跨平台兼容,可通过宏封装差异,如定义DLL_EXPORT、DEPRECATED等宏,结合编译器条件判断(_MSC_VER或__GNUC__),统一导出符号、标记过时函数或设置内存对齐,从而实现Windows、Linux、macOS上的通用编译。

在C++开发中,__attribute__ 和 __declspec 是用于控制编译器行为的扩展关键字,常用于函数、变量或类的属性设置。它们分别对应GCC/Clang和MSVC编译器,实现跨平台时需要做条件封装。
__attribute__(GCC/Clang)常用用法
GNU风格编译器通过 __attribute__ 提供丰富的编译指示:
- format:检查printf/scanf格式字符串 void my_printf(const char* fmt, ...) __attribute__((format(printf, 1, 2)));
- unused:抑制“未使用”警告 int dummy_var __attribute__((unused));
- deprecated:标记过时函数 void old_func() __attribute__((deprecated));
- aligned:指定内存对齐 int x __attribute__((aligned(16)));
- visibility:控制符号导出(Linux/Unix) void api_func() __attribute__((visibility("default")));
__declspec(MSVC)常用等效功能
Windows平台MSVC使用 __declspec 实现类似功能:
- dllexport:导出动态库符号 __declspec(dllexport) void api_func();
- dllimport:导入动态库符号 __declspec(dllimport) void api_func();
- deprecated:标记废弃函数 __declspec(deprecated) void old_func();
- align:内存对齐 __declspec(align(16)) int x;
跨平台属性宏封装技巧
为兼容不同编译器,建议用宏抽象差异:
立即学习“C++免费学习笔记(深入)”;
#define COMPILER_PREFIX(x) COMPILER_PREFIX_ ## x#define COMPILER_PREFIX___attribute__
#define COMPILER_PREFIX___declspec
#if defined(_MSC_VER)
#define DLL_EXPORT __declspec(dllexport)
#define DLL_IMPORT __declspec(dllimport)
#define DEPRECATED __declspec(deprecated)
#elif defined(__GNUC__)
#define DLL_EXPORT __attribute__((visibility("default")))
#define DLL_IMPORT
#define DEPRECATED __attribute__((deprecated))
#endif
// 使用示例
DLL_EXPORT void engine_init();
DEPRECATED void legacy_api();
这样封装后,代码可在Windows、Linux、macOS上统一编译,无需修改核心逻辑。
基本上就这些。











