【发布时间】:2015-11-28 02:23:37
【问题描述】:
我正在尝试构建一些自身需要容纳多个结构的 C 结构。它看起来像这样:
typedef struct hdr_t {
uint16_t a;
uint16_t b;
uint8_t c;
uint8_t d[3];
uint64_t e;
uint8_t f[];
} hdr_t;
typedef struct {
uint64_t data;
} pyld_t;
typedef struct {
hdr_t hdr;
pyld_t pyld;
} msg_t;
当我编译它时,根据编译器和设置,我会收到警告。
./file.h:55:24: warning: field 'hdr' with variable sized type 'hdr_t'
(aka 'struct hdr_t') not at the end of a struct or class is a GNU extension
[-Wgnu-variable-sized-type-not-at-end]
hdr_t hdr;
对于这个例子,我使用的是 clang 6.1.0:
$ clang --version
Apple LLVM 版本 6.1.0 (clang-602.0.53)(基于 LLVM 3.6.0svn)
目标:x86_64-apple-darwin14.5.0
线程模型:posix
警告抱怨我正在做的是一个不可移植的 GNU 扩展,我宁愿避免。我能做些什么来解决这个问题?有没有一种安全的方法可以将多个结构放入一个结构中?当然不是这样的。
【问题讨论】:
-
你不能。但是,您可以拥有一个带有指针的结构,指向具有灵活数组成员的结构。
-
你能给出
A_t和B_t的完整声明 -
只有结构的最后一个字段可以有可变大小。您可能需要为要“保留”的一个或两个结构使用指向另一个对象的指针。
-
您提供的编译器诊断与您提供的代码不对应。
A_t和B_t类型不是可变大小的。有了这些声明,C_t类型的声明应该没有任何问题。如果clang真的对此表示反对,正如您所介绍的那样,那么它将构成一个错误。但是,我认为您更有可能从示例中简化了真正的问题。 -
@LPs 这是一个功能,而不是一个“功能”。