你能解释一下这里的结构是如何创建的吗?冒号有什么作用:?
/**
* @brief Bit-field structure of the state of the packet reception
*/
typedef struct{
uint32_t Length :16; /*!< The number of bytes in the packet including header and CRC. */
uint32_t PF_ERR :1; /*!< A sign package PAUSE. */
uint32_t CF_ERR :1; /*!< A sign Management Pack (filtering by MAC and special tags in the field length - 13.14 - octets). */
uint32_t LF_ERR :1; /*!< A sign excess packet length 1518 octets. */
uint32_t SF_ERR :1; /*!< A sign of lack of packet length 64 octets. */
uint32_t LEN_ERR :1; /*!< A sign mismatch between the actual length and the length specified in the length field - 13.14 octets. */
uint32_t DN_ERR :1; /*!< A sign bit of the packet is not a multiple of 8. */
uint32_t CRC_ERR :1; /*!< A sign mismatch packet CRC. */
uint32_t SMB_ERR :1; /*!< A sign of the presence in the packet error nibbles. */
uint32_t MCA :1; /*!< A sign group package (MAC matches HASH). */
uint32_t BCA :1; /*!< A sign of the broadcast packet (MAC = FF:FF:FF:FF:FF:FF). */
uint32_t UCA :1; /*!< A sign individual package (MAC corresponds to the set). */
}ETH_StatusPacketReceptionBitFileds;
在冒号之后,结构成员以位为单位给出该成员的大小。那些。这样的成员是位域。这主要用于打包数据,同时仍然保持轻松访问更改和读取值。同时禁止对位域进行取地址操作。
实际上,对结构的注释已经包含了答案:
ETH_StatusPacketReception BitFileds结构本身的名称包含短语BitFileds。这个结构指定了位域,也就是结构的整数数据成员的一种更紧凑的写法,因为事先知道这些数据成员将存储有限的值,分配几个位来表示它们就足够了。
例如,您可以这样定义此结构:
但在这种情况下,结构的每个数据成员将占用 32 位内存,或 4 个字节。并且如果你知道,例如,结构的数据成员
PF_ERR只能取两个值,0 或 1,那么将这些值存储在具有 32 位的数据成员中将是一种浪费,因为只有一位是足以表示 0 或 1。因此,结构被定义为具有给定位数的位字段的结构。这些位域由编译器打包到对象中,如结构 type 的位域声明中所指定uint32_t。也就是说,原则上可以将大小为 1 位的 32 位字段打包到一个此类对象中。这节省了为结构对象分配的内存。来自 C++ 标准(9.6 位域 [class.bit])