C 编程 - 结构体中的 2U 或 8U 是什么

0 c struct literals

此链接中的代码: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;
Run Code Online (Sandbox Code Playgroud)

假设 32 位填充,该结构的总大小是否为 44 字节?每个结构体成员末尾的 10u、2u 是什么?

Lun*_*din 5

这是一种称为位字段的不可移植类型的结构,其中某些成员的大小以位为单位,由: n每个成员后面指定。MaxOperatingCurrent10mAunits10 位也是如此,依此类推。C 语言没有指定位顺序,因此它可以是任何内容。

一般建议是始终避免使用位字段,并使用位掩码和位移位以及按位运算符,因为它们是可移植的和确定性的。与 C 标准严重未指定的位字段不同。

在这种情况下,将位大小指定为以u/结尾的无符号整数常量U没有任何意义。始终使用未签名而不是签名是一般的良好做法,但在这种特定情况下并不重要。一些编码标准(例如 MISRA C)在需要无符号类型的地方强制执行无符号常量,因此可以写入位大小u以静默 MISRA 检查器。