跳到主要内容

公共定义

libxr_def.hpp 提供 LibXR 中最基础的宏、常量、错误码及通用模板函数,其他头文件都依赖它。

数学与物理常量​

  • PI, TWO_PI: 圆周率及其两倍,常用于角度计算。
  • STANDARD_GRAVITY: 标准重力加速度常量,值为 9.80665 m/s²。

常用宏定义​

  • DEF2STR(x): 将宏值转为字符串。
  • UNUSED(x): 用于消除未使用变量的编译器警告。
  • LIBXR_NOINLINE: 禁止内联的兼容性宏。
  • LIBXR_PACKED_BEGIN / LIBXR_PACKED_END / LIBXR_PACKED: 结构体紧凑布局相关宏。

对齐与缓存行定义​

  • HW_CACHE_LINE_SIZE:硬件缓存行大小,指针为 8 字节的平台取 64,其余取 32。
  • CONCURRENCY_ALIGNMENT:并发结构使用的对齐粒度。LIBXR_SINGLE_CORE 为真时取 sizeof(size_t),否则取 HW_CACHE_LINE_SIZE;CMake 中 linux、webots、windows 平台默认 LIBXR_SINGLE_CORE=OFF,其余平台默认 ON。
  • CACHE_LINE_SIZE: 面向旧代码保留的缓存行别名。
  • ALIGN_SIZE: 平台自然对齐大小,当前取 sizeof(void*)。

错误码定义(ErrorCode)​

枚举类型 ErrorCode 定义了统一的错误码系统,用于表示各类操作结果:

名称值含义
PENDING1操作进行中
OK0操作成功
FAILED-1操作失败
INIT_ERR-2初始化错误
ARG_ERR-3参数错误
STATE_ERR-4状态错误
SIZE_ERR-5尺寸错误
CHECK_ERR-6校验失败
NOT_SUPPORT-7功能不支持
NOT_FOUND-8未找到对象
NO_RESPONSE-9无响应
NO_MEM-10内存不足
NO_BUFF-11缓冲区不足
TIMEOUT-12操作超时
EMPTY-13数据为空
FULL-14数据已满
BUSY-15资源忙碌中
PTR_NULL-16空指针错误
OUT_OF_RANGE-17超出有效范围

约定:正值通常用于表示“非终态/进行中”(例如 PENDING),0 表示成功,负值表示失败原因。

尺寸限制模式(SizeLimitMode)​

用于运行时检查尺寸是否符合要求:

  • EQUAL: 必须等于参考值
  • LESS: 小于或等于参考值
  • MORE: 大于或等于参考值
  • NONE: 不限制尺寸

尺寸检查函数:

constexpr bool SizeLimitCheck(SizeLimitMode mode, size_t limit, size_t size) noexcept;

它是一个纯判断函数,只回答“尺寸关系是否成立”,不替调用方决定应该断言、终止还是返回错误码。

断言宏​

libxr_def.hpp 还定义 ASSERT、REQUIRE、DEV_ASSERT 三组检查宏,各自的生效条件、关闭时的行为和失败处理见断言与错误处理。

通用模板工具​

此外还提供:

  • OffsetOf(member):通过成员指针计算成员偏移量;
  • ContainerOf(ptr, member):通过成员指针恢复所属对象指针;
  • MemberObjectPointer / CommonOrdered 这类 concept 约束。

这些接口主要用于底层容器和驱动代码中由成员指针恢复所属对象。

通用模板函数​

template <typename LeftType, typename RightType>
requires CommonOrdered<LeftType, RightType>
constexpr auto LibXR::max(LeftType a, RightType b) -> std::common_type_t<LeftType, RightType>;

template <typename LeftType, typename RightType>
requires CommonOrdered<LeftType, RightType>
constexpr auto LibXR::min(LeftType a, RightType b) -> std::common_type_t<LeftType, RightType>;

两个参数须有公共类型且可比较大小,返回值为公共类型,例如 LibXR::max(3, 4.5) 返回 4.5(double)。