如何在 const struct 中初始化联合?
Posted
技术标签:
【中文标题】如何在 const struct 中初始化联合?【英文标题】:How can I initialize the union in const struct? 【发布时间】:2013-01-22 10:16:41 【问题描述】: const struct EbmlSyntax
uint32_t id;
EbmlType type;
int list_elem_size;
int data_offset;
union
uint64_t u;
double f;
const char *s;
const struct EbmlSyntax *n;
def;
;
我必须使用上面的 const 结构并想使用
创建一个常量结构 EBML_ID_DOCTYPE, EBML_STR, 0, offsetof(Ebml,doctype), .def.s = "(none)"
但是,VS8.0 编译器给出了错误 error C2143: syntax error : missing '' before '.'当我编译 C++ 项目时。
我尝试了几种方法,但是,我只找到了将 char * 转换为 uint64_t(分配给第一种类型)的方法,
(uint64_t)("none")
我可以使用联合。这种方法安全吗?我使用 VS 调试工具检查了这个和其他 struct-union 对象的结构。似乎可以正确解释 struct 和 union 的成员。
【问题讨论】:
我觉得def.s
前面的.
应该去掉
C++ 没有指示符(.def.s =
表示法)。 C 支持,但仅从 C99 开始,微软不支持。
是的,你是对的。我尝试了几种方法,但是,我只找到了将char *转换为uint64_t的方法,我可以使用联合。这种方法安全吗?好像没问题。
严格来说,它并不安全,但我认为它应该适合实际使用。
【参考方案1】:
您只能使用该语法初始化联合的第一个元素。 你需要另一种方法。
【讨论】:
【参考方案2】:给struct
一个构造函数,然后进行初始化
那里。当然,这不是静态初始化,但如果
在您进入main
之前不会使用结构,这不应该是
一个问题。
如果确实需要静态初始化,替换union
带有struct
。这将增加对象的大小,
但这应该不是一个大问题,如果它只用于
一些静态初始化的对象。
【讨论】:
以上是关于如何在 const struct 中初始化联合?的主要内容,如果未能解决你的问题,请参考以下文章
Java中没有联合体union,应该如何实现union功能呢