谷歌 C++ 编程规范——结构体类型

发布于:2025-08-02 ⋅ 阅读:(12) ⋅ 点赞:(0)
typedef union {
    uint16_t value;
    struct {
	rt_uint16_t FLRadar : 1; // 前左雷达
	rt_uint16_t FRRadar : 1; // 前右雷达
	rt_uint16_t BLRadar : 1; // 后左雷达
	rt_uint16_t BRRadar : 1; // 后右雷达
	rt_uint16_t sucking : 1; // 吸盘吸附状态
	rt_uint16_t emgStop : 1; // 急停按键状态
	rt_uint16_t motorEn : 1; // 电机供电
	rt_uint16_t brakeEn : 1; // 机械抱闸状态
	rt_uint16_t reserve : 8; // 预留
    }bits;
} UnRecStatus;

改成谷歌风格


根据 Google C++ Style Guide(谷歌 C++ 编程规范),对你的 typedef union 结构进行风格调整时,需注意以下几点:


✅ 谷歌风格关键要求:

  1. 类型名使用 CamelCase(大驼峰),如 MyStruct
  2. 避免使用 typedef 隐藏 unionstruct 关键字 —— Google 建议显式使用 struct/union
  3. 位域(bit fields)可以使用,但需谨慎,尤其是跨平台时注意可移植性。
  4. 注释使用 ///* */,建议每行字段后加注释说明
  5. 命名清晰,避免缩写(如 FLRadar 可改为 front_left_radar 更清晰,但若团队已有约定可保留)。
  6. 推荐使用 uint16_t 等固定宽度类型(你已经用了,很好)。

❌ 原始代码问题(不符合 Google 风格):

  • 使用了 typedef 隐藏 union 类型。
  • 字段命名使用了驼峰但不够清晰(如 sucking)。
  • 注释用了中文,虽然可读但非英文不符合通用规范(视团队而定)。
  • rt_uint16_t 不是标准类型(应统一为 uint16_t,除非 rt_ 是项目前缀且必须保留)。

✅ 改为 Google 风格的推荐写法:

// Status union to represent 16-bit status register with bit fields.
union UnRecStatus {
  uint16_t value;

  struct {
    uint16_t FLRadar : 1;   // Front-left radar status
    uint16_t FRRadar : 1;   // Front-right radar status
    uint16_t BLRadar : 1;   // Back-left radar status
    uint16_t BRRadar : 1;   // Back-right radar status
    uint16_t sucking : 1;   // Suction cup attachment status
    uint16_t emgStop : 1;   // Emergency stop button status
    uint16_t motorEn : 1;   // Motor power enable
    uint16_t brakeEn : 1;   // Brake enable status
    uint16_t reserve : 8;   // Reserved bits (unused)
  } bits;
};

⚠️ 注意:不再使用 typedef。直接使用 union UnRecStatus 声明变量。


✅ 使用示例:

UnRecStatus status;
status.value = 0;
status.bits.FLRadar = 1;

if (status.bits.emgStop) {
  // Handle emergency stop
}

🔔 补充建议(可选优化):

如果你希望字段命名更清晰、符合 Google 推荐的“可读性强”原则,可考虑:

struct Bits {
  uint16_t front_left_radar  : 1;  // FLRadar
  uint16_t front_right_radar : 1;  // FRRadar
  uint16_t back_left_radar   : 1;  // BLRadar
  uint16_t back_right_radar  : 1;  // BRRadar
  uint16_t suction_cup       : 1;  // sucking
  uint16_t emergency_stop    : 1;  // emgStop
  uint16_t motor_power       : 1;  // motorEn
  uint16_t brake_enabled     : 1;  // brakeEn
  uint16_t reserved          : 8;
} bits;

但若项目已有命名规范(如 FLRadar 是协议定义字段),保留原始命名也可接受。


✅ 总结:修改要点

项目 修改前 修改后(Google 风格)
typedef union { ... } Name; ❌ 不推荐 union Name { ... };
类型名 UnRecStatus ✅ 保留(大驼峰,合规)
位字段结构 内联 ✅ 保持内联,命名清晰
注释 中文 ✅ 建议改为英文
rt_uint16_tuint16_t ✅ 替换为标准类型(除非必须保留)

✅ 最终结论:去掉 typedef,直接定义 union,使用大驼峰命名,字段加英文注释,即符合 Google C++ 风格。


网站公告

今日签到

点亮在社区的每一天
去签到