如何在 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功能呢

随笔--类和对象初阶问题总结(面试)

在c中的静态const结构中强制成员初始化

C++ 成员引用基类型'Vertex *const'不是结构或联合

十八初始化列表的使用

static与const联合使用&&extern与const联合使用