#pragma once /** * @file version.h * @brief ViewDesignEngine 版本信息 * * 提供编译时版本宏和运行时版本查询函数。 * 编译时间戳通过 CMake 的 configure_file 在构建时注入。 * * @ingroup core */ #include #include // 包含 CMake 生成的构建配置 #if __has_include("vde_build_config.h") #include "vde_build_config.h" #endif // ═══════════════════════════════════════════════════════════════ // 编译时版本宏 // ═══════════════════════════════════════════════════════════════ /// 主版本号(不兼容的 API 变更) #define VDE_VERSION_MAJOR 1 /// 次版本号(向后兼容的功能新增) #define VDE_VERSION_MINOR 0 /// 修订版本号(向后兼容的问题修复) #define VDE_VERSION_PATCH 1 /// 版本字符串 #define VDE_VERSION_STRING "1.0.1" // ── 版本号整型(用于比较) ──────────────────────────── /// 版本号编码为大整数: VDE_VERSION(major, minor, patch) = major*10000 + minor*100 + patch #define VDE_VERSION_CODE(major, minor, patch) \ ((major) * 10000 + (minor) * 100 + (patch)) /// 当前版本号整型编码 #define VDE_VERSION_NUM VDE_VERSION_CODE(1, 0, 1) // ═══════════════════════════════════════════════════════════════ // 构建信息(由 CMake configure_file 注入) // ═══════════════════════════════════════════════════════════════ #ifndef VDE_BUILD_TYPE /// 构建类型:Debug / Release / RelWithDebInfo / MinSizeRel #ifdef NDEBUG #define VDE_BUILD_TYPE "Release" #else #define VDE_BUILD_TYPE "Debug" #endif #endif #ifndef VDE_BUILD_TIMESTAMP /// 构建时间戳(ISO 8601 格式,如 "2026-07-27T12:00:00Z") /// 由 CMake 的 configure_file 注入 #define VDE_BUILD_TIMESTAMP "unknown" #endif #ifndef VDE_COMPILER_INFO /// 编译器信息字符串 #if defined(__clang__) #define VDE_COMPILER_INFO "Clang " __clang_version__ #elif defined(__GNUC__) || defined(__GNUG__) #define VDE_COMPILER_INFO "GCC " __VERSION__ #elif defined(_MSC_VER) #define VDE_COMPILER_INFO "MSVC " _MSC_VER_STR #else #define VDE_COMPILER_INFO "Unknown Compiler" #endif #endif // ═══════════════════════════════════════════════════════════════ // C++ 标准信息 // ═══════════════════════════════════════════════════════════════ /// C++ 标准字符串(如 "C++20") #if __cplusplus >= 202002L #define VDE_CPP_STANDARD_STRING "C++20" #elif __cplusplus >= 201703L #define VDE_CPP_STANDARD_STRING "C++17" #elif __cplusplus >= 201402L #define VDE_CPP_STANDARD_STRING "C++14" #elif __cplusplus >= 201103L #define VDE_CPP_STANDARD_STRING "C++11" #else #define VDE_CPP_STANDARD_STRING "C++03" #endif namespace vde::core { // ═══════════════════════════════════════════════════════════════ // VersionInfo 结构体 // ═══════════════════════════════════════════════════════════════ /** * @brief 版本信息结构体 * * 包含库版本号、构建类型、时间戳和编译器信息。 */ struct VersionInfo { int major; ///< 主版本号 int minor; ///< 次版本号 int patch; ///< 修订版本号 std::string version_string; ///< 版本字符串 "1.0.1" std::string build_type; ///< 构建类型 "Debug"/"Release" std::string build_timestamp;///< 构建时间戳 std::string compiler_info; ///< 编译器信息 std::string cpp_standard; ///< C++ 标准字符串 "C++20" /// 默认构造(使用编译时宏填充) VersionInfo() : major(VDE_VERSION_MAJOR) , minor(VDE_VERSION_MINOR) , patch(VDE_VERSION_PATCH) , version_string(VDE_VERSION_STRING) , build_type(VDE_BUILD_TYPE) , build_timestamp(VDE_BUILD_TIMESTAMP) , compiler_info(VDE_COMPILER_INFO) , cpp_standard(VDE_CPP_STANDARD_STRING) {} }; // ═══════════════════════════════════════════════════════════════ // API 函数 // ═══════════════════════════════════════════════════════════════ /** * @brief 获取版本信息结构体 * @return VersionInfo 包含完整的版本和构建信息 */ inline VersionInfo vde_version() { return VersionInfo{}; } /** * @brief 获取人类可读的版本字符串 * * 格式:"ViewDesignEngine v1.0.1 (C++20, GCC 11.4)" * * @return 版本信息字符串 */ inline std::string vde_version_string() { std::string result = "ViewDesignEngine v"; result += VDE_VERSION_STRING; result += " ("; result += VDE_CPP_STANDARD_STRING; result += ", "; result += VDE_COMPILER_INFO; result += ")"; return result; } /** * @brief 比较两个版本号 * * 返回负值表示 lhs < rhs,零表示相等,正值表示 lhs > rhs。 * * @param lhs_major 左主版本 * @param lhs_minor 左次版本 * @param lhs_patch 左修订版本 * @param rhs_major 右主版本 * @param rhs_minor 右次版本 * @param rhs_patch 右修订版本 * @return 比较结果 */ inline int vde_version_compare(int lhs_major, int lhs_minor, int lhs_patch, int rhs_major, int rhs_minor, int rhs_patch) { int lhs = VDE_VERSION_CODE(lhs_major, lhs_minor, lhs_patch); int rhs = VDE_VERSION_CODE(rhs_major, rhs_minor, rhs_patch); return lhs - rhs; } } // namespace vde::core