【发布时间】:2018-01-18 09:29:24
【问题描述】:
我正在处理的项目中有一个代表 USB 操纵杆报告的联合:
union {
struct{
uint8_t xaxis;
uint8_t yaxis;
uint8_t xraxis;
uint8_t yraxis;
uint8_t zraxis;
uint8_t slider;
uint8_t buttons8;
uint8_t buttons16;
};
uchar buffer[8];
} report;
这样我可以轻松地将值放入结构成员并使用缓冲区成员通过 USB 发送该数据,但是我最终为不同的项目修改了这个联合(轴上的不同分辨率,更多/更少按钮等)所以我必须弄清楚结构的新大小是什么,以声明具有相同大小的数组。
有没有办法自动使数组大小相同?我想过使用sizeof,这需要我像这样更改结构:
union {
struct _data{ // either this
uint8_t xaxis;
uint8_t yaxis;
uint8_t xraxis;
uint8_t yraxis;
uint8_t zraxis;
uint8_t slider;
uint8_t buttons8;
uint8_t buttons16;
} data; // or this
uchar buffer[8];
} report;
但是我不能再像这样将数据放入结构中:
report.xaxis = value;
而是:
report.data.xaxis = value;
我不想要的。
有没有办法干净利落地做到这一点?
【问题讨论】:
-
不要使用未标记的结构。然后使用
sizeof(structure tag)作为维度。 -
@JonathanLeffler 你能详细说明一下吗?我看不出这如何让我避免不得不做类似
report.data.xaxis = value -
就像 Lundin 在他的回答中显示的那样。区分允许您引用结构类型的结构标记和成员名称。您应该能够使用匿名结构,但您需要标签,以便您可以引用类型并获取其大小。
-
@JonathanLeffler - 如果它被标记,它不是一个匿名结构。至少不是根据n1570。
-
@StoryTeller:标记的结构可以是联合的匿名成员,就像未标记的结构也可以一样。我要离开这里几个小时——我需要找个时间睡觉。但是,虽然未标记的结构是一种匿名的,但您可以拥有结构或联合的匿名元素,这些匿名元素可以是已标记或未标记的结构(或各种其他类型)。