macros - 宏定义系统¶
macros.h 是 CFDesktop 项目的宏定义入口文件,本身不直接定义宏,而是引入 system_judge.h 来完成平台检测。这个设计把平台相关的宏定义集中管理,避免在代码里到处散落 #ifdef 检查。
平台检测¶
项目目前支持 Windows 和 Linux 两个桌面平台,通过 system_judge.h 自动检测:
#include "base/macros.h"
// 编译时会自动定义以下宏之一
#ifdef CFDESKTOP_OS_WINDOWS
// Windows 特定代码
#elif defined(CFDESKTOP_OS_LINUX)
// Linux 特定代码
#endif
检测逻辑基于编译器预定义宏。Windows 平台检查 _WIN32 或 _WIN64,Linux 平台检查 __linux__。这些是主流编译器(MSVC、GCC、Clang)都遵守的约定。
架构检测¶
除了操作系统,我们还关心 CPU 架构,特别是在做性能优化或 SIMD 操作时:
#ifdef CFDESKTOP_ARCH_X86_64
// x86-64 (AMD64) 特定代码
#elif defined(CFDESKTOP_ARCH_ARM64)
// ARM64 特定代码
#elif defined(CFDESKTOP_ARCH_ARM32)
// ARM32 特定代码
#endif
x86-64 检查 __x86_64__、_M_X64 或 __amd64__,ARM64 检查 __aarch64__ 或 _M_ARM64,ARM32 检查 __arm__ 或 _M_ARM。这覆盖了我们项目目标平台的所有主流架构。
使用场景¶
平台检测宏最常见的用途是条件编译和平台特定代码隔离:
// 场景一:条件编译
std::string get_config_path() {
#ifdef CFDESKTOP_OS_WINDOWS
return getenv("APPDATA") + std::string("/myapp/config");
#elif defined(CFDESKTOP_OS_LINUX)
return getenv("HOME") + std::string("/.config/myapp");
#endif
}
// 场景二:平台特定头文件
#include "base/macros.h"
#ifdef CFDESKTOP_OS_WINDOWS
#include <windows.h>
#elif defined(CFDESKTOP_OS_LINUX)
#include <unistd.h>
#endif
// 场景三:不同平台的实现细节
void set_thread_priority(int priority) {
#ifdef CFDESKTOP_OS_WINDOWS
SetThreadPriority(GetCurrentThread(), priority);
#elif defined(CFDESKTOP_OS_LINUX)
// Linux 实现省略...
#endif
}
命名约定¶
所有自定义宏都带 CFDESKTOP_ 前缀,避免和第三方库或系统宏冲突。如果你需要添加新的平台检测宏,记得遵守这个约定。
注意事项¶
使用宏检测有几个需要注意的地方。第一,这些宏是编译时确定的,不能在运行时切换。如果你需要同一个二进制在多个平台运行,那得用动态加载或抽象工厂模式。
第二,不要过度使用平台宏。大部分跨平台差异应该通过封装类或函数来处理,而不是到处写 #ifdef。我们这套基础工具库的目的就是帮你隔离这些差异,让上层业务代码不需要关心平台细节。
第三,宏定义在预处理阶段生效,IDE 的跳转和重构工具通常不会跟踪它们。如果你在重构时修改了宏名字,记得全局搜索替换,不要只信任 IDE 的引用查找。
扩展指南¶
如果需要支持新的平台或架构,在 system_judge.h 中添加相应的检测逻辑:
然后记得在对应的地方添加平台特定实现,并写测试确保在新平台上能正确编译和运行。