C 结构中空位字段的用途?

C 结构中空位字段的用途?,c,bit-fields,C,Bit Fields,假设我有一个定义如下的结构: typedef struct Counters { uint8_t counterSec : 6; uint8_t : 3; uint8_t counterMin : 6; uint8_t : 3; uint8_t counterHr : 5; uint8_t : 1; }; 因为我想为前两个计数器分配6位,为最后一个计数器分配5位,所以我最终得到17位,这意味着总共24位将分配给计数器类型结构变量的实例。在上面的结

假设我有一个定义如下的结构:

typedef struct Counters {
    uint8_t counterSec : 6;
    uint8_t : 3;
    uint8_t counterMin : 6;
    uint8_t : 3;
    uint8_t counterHr : 5;
    uint8_t : 1;
};

因为我想为前两个计数器分配6位,为最后一个计数器分配5位,所以我最终得到17位,这意味着总共24位将分配给计数器类型结构变量的实例。在上面的结构中定义空位字段(如果有)有什么实际意义


针对这个问题的两面性,以前确实有人提出过类似的问题。我遇到空位字段的情况与微控制器编程和配置寄存器有关-因此,问题是关于在特定情况下使用空位字段。不幸的是,类似帖子的答案并没有解决这些问题。希望这将进一步证明这个问题的合理性:

您可能会看到一个空的位字段,原因有很多。它们可能会保留供将来使用,例如扩展现有字段而不必更改其偏移量。它们也可能用于对齐目的,填充到一些漂亮的圆形对齐。在从硬件寄存器传递到硬件寄存器的结构中,可以看到空位字段,因为硬件将要求结构的精确位布局。无论这些字段的用途是什么,给它们一个有意义的名称将有助于表明它们的用途


作为旁注,您的结构看起来有点不协调。您使用的是8位数据类型,但字段不与任何特定边界对齐。要么将3位保留空间更改为2位,使每对字段都可以放入一个uint8\u t,要么使用一种数据类型,如uint32\u t,它可以将所有字段保存在一个uint32\u t中。

位字段完全是邪恶的、不可预测的。您永远不应该假设编译器为位字段选择的大小或位顺序,没有办法使其可靠。一个编译器的一个版本每次都会以相同的方式执行,除非有命令行选项影响它。但是,根据定义,如果字段适合的位顺序、间距或总体大小是一项要求,那么代码就不能跨版本或编译器移植。这取决于答案,这个问题没有一个真正的答案。对于任何给定的编译器,您关于将分配多少位的假设都是没有根据的,并且可能是错误的。您未命名的位字段的用途是什么?是那些分配块。它们将依赖于硬件和编译器,因此您假设将使用24位来包含该结构是没有根据的。在某些处理器上使用某些编译器和某些编译器选项时会出现这种情况,而在其他情况下则会出现这种情况。如果元素的结果大小对您的设计很重要,我不会使用位字段。定义空位字段的实际意义是什么?这取决于您的想象。这在c语言中是可能的,因此可以利用它。可能出错的是你提出的逻辑。它可以是支票持有人,也可以是边界守卫,在联合中连接多个结构。正如我所说,想象力是极限。回答得很好,谢谢!另外,关于硬件寄存器的部分是现场的——在使用uC时,我在头文件中的初始化例程中遇到了一个结构,其中包含空位字段。未命名位字段的用途很清楚。目前尚不清楚的是,为什么OP会为他们选择如此奇怪的数字。