跳转至

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 中添加相应的检测逻辑:

// 添加新平台的示例
#if defined(__NEW_OS__)
#    define CFDESKTOP_OS_NEW_OS
#endif

然后记得在对应的地方添加平台特定实现,并写测试确保在新平台上能正确编译和运行。

相关文档