【发布时间】:2021-12-22 23:21:57
【问题描述】:
在我正在使用的图书馆中,我发现了这样的结构:
typedef struct {
uint16_t id;
uint16_t len;
union {
uint8_t data[0];
uint16_t data16[0];
uint32_t data32[0];
}
} packet_t;
所以这是一个具有灵活长度数据的数据包,可以访问每个字长。
但标准规定对象的大小不能为零,因此编译它会引发警告(“ISO C 禁止零大小数组”)。
我在 gcc 中编译代码,因此这个零大小的数组 hack 将由于它的扩展而做得很好。但是有什么办法可以让我对此真正“迂腐”吗?由于联合,灵活数组成员没有帮助。
如果我只是扔掉多字节数据成员会很简单,但我想尽可能地保留它们,因为库中的某些函数依赖于这些。
起初我以为我可以改用一个大小的数组,但我不确定是否完全没有副作用。有什么建议吗?
【问题讨论】:
-
我不明白你的问题。你想学究什么?你要解决什么问题?
-
@MarcusMüller 使用代码没有问题。我很好奇的是是否有更符合标准的方式来编写它。 (因为按照标准,大小为零的数组是非法的)
-
您能否编辑您的问题以说明这一点?
-
放弃联合,跟踪你存储的数据类型,然后使用
uint8_t的灵活数组成员。 -
@Lundin 当然可以。这是图书馆的一个小告密者,它确实有一个序列化器:)
标签: arrays c language-lawyer flexible-array-member