【发布时间】:2017-04-13 13:45:32
【问题描述】:
这是一个长镜头,但也许会有一些想法。在我编程的系统上,我已经定义了对处理器寄存器进行编程的结构。寄存器由几个字段组成,每个字段有几个位,中间有潜在的“保留”位。写入寄存器时,保留位必须写为零。
例如:
typedef struct {
uint32_t power : 3;
uint32_t reserved : 24;
uint32_t speed : 5;
} ctrl_t;
void set_ctrl()
{
ctrl_t r = {
.power = 1;
.speed = 22;
.reserved = 0;
}
uint32_t *addr = 0x12345678;
*addr = *((uint32_t *) &r);
return;
}
我希望能够将 reserved 字段设置为默认值(在本例中为 0),并且无需显式分配(这在我们的系统中经常发生)。
请注意,如果实例化对象是静态的,那么默认情况下未初始化的字段将为 0。但是,在上面的示例中并不能保证,我还需要设置任意值。
【问题讨论】:
-
恐怕你不能。如果你的变量不是静态的,那么你需要显式地初始化它。
-
不保证位域的特定布局。如果您需要,它们不是一个好主意。改用
unit32_t和移位/屏蔽。并且您强制转换调用未定义的行为;您必须将一种类型的对象作为不同类型访问!阅读有效类型(又名严格别名)规则。 -
@Olaf - 在给定的实现(我们的嵌入式开发环境)上,行为应该被很好地定义(因为它恰好是)。我使用 all-
uint32_t结构的事实确保字段是右对齐的,并且该结构的大小正好是 32 位。 -
@Olaf - 你是对的,虽然 如果我混合成员类型,不能保证对齐。最初,我根据枚举定义字段,虽然枚举被提升为整数,但编译器没有正确打包它们,即使我添加了
packed修饰符。 -
只需省略
.reserved = 0;。未提及的字段设置为 0。
标签: c struct types initialization c99