此链接中的代码:https://github.com/openwch/arduino_core_ch32/blob/main/libraries/USBPD_SINK/src/usbpd_def.h
我正在查看上一个文件。我做了一些搜索,发现了一些关于 unsign int Literal 的内容。但是,我不确定在这种情况下它有何意义,希望有人可以向我解释一下。
typedef struct
{
uint32_t MaxOperatingCurrent10mAunits : 10u;
uint32_t OperatingCurrentIn10mAunits : 10u;
uint32_t Reserved20_21 : 2u; // 00b
uint32_t EPRModeCapable : 1u;
uint32_t UnchunkedExtendedMessage : 1u;
uint32_t NoUSBSuspend : 1u;
uint32_t USBCommunicationsCapable : 1u;
uint32_t CapabilityMismatch : 1u;
uint32_t GiveBackFlag : 1u;
uint32_t ObjectPosition : 4u;
}USBPD_SinkFixedVariableRDO_t;
假设 32 位填充,该结构的总大小是否为 44 字节?每个结构体成员末尾的 10u、2u 是什么?
这是一种称为位字段的不可移植类型的结构,其中某些成员的大小以位为单位,由每个成员后面的
: n
指定。所以 MaxOperatingCurrent10mAunits
是 10 位大,依此类推。位顺序不是由 C 语言指定的,因此它可以是任何内容。
一般建议是避免使用位字段,而是使用位掩码和位移位以及按位运算符,因为它们是可移植的和确定性的。与 C 标准严重未指定的位字段不同。
在这种情况下,位大小被指定为以
u
/U
结尾的无符号整数常量没有任何意义。始终使用未签名而不是签名是一般的良好做法,但在这种特定情况下并不重要。一些编码标准(例如 MISRA C)在需要无符号类型的地方强制执行无符号常量,因此可以使用 u
写入位大小,以静默 MISRA 检查器。