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
结构进行风格调整时,需注意以下几点:
✅ 谷歌风格关键要求:
- 类型名使用
CamelCase
(大驼峰),如MyStruct
。 - 避免使用
typedef
隐藏union
或struct
关键字 —— Google 建议显式使用struct
/union
。 - 位域(bit fields)可以使用,但需谨慎,尤其是跨平台时注意可移植性。
- 注释使用
//
或/* */
,建议每行字段后加注释说明。 - 命名清晰,避免缩写(如
FLRadar
可改为front_left_radar
更清晰,但若团队已有约定可保留)。 - 推荐使用
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_t → uint16_t |
✅ 替换为标准类型(除非必须保留) |
✅ 最终结论:去掉 typedef
,直接定义 union
,使用大驼峰命名,字段加英文注释,即符合 Google C++ 风格。