【问题标题】:Union initialisation in a struct结构中的联合初始化
【发布时间】:2012-04-16 13:20:50
【问题描述】:

我一直在浏览有关在结构中初始化联合的问题的 stackoverflow,但我没能做到正确。

这是我的结构

typedef struct dc_netif_filter {
    unsigned char filter_type;  
    union {
        uint32_t itf_nb;
        char * buf; 
    } value;
} dc_netif_filter_t;  

在我的代码中,我尝试使用:

dc_netif_filter_t netif = {DC_NETIF_SELECT_NAME,{{0, "tun"}}};  

这给出了错误:用于类型“uint32_t”的标量初始值设定项的大括号

dc_netif_filter_t netif = {DC_NETIF_SELECT_NAME,{0, "tun"}};  

这给出了错误:'dc_netif_filter::'的初始化程序太多

如何声明这样的 dc_netif_filter_t ?

我在 ubuntu 上使用 g++。请注意,dc_netif_filter_t 不是我可以修改的结构,因为它来自第三方项目。

**编辑:正如我已经解释过的,我只能初始化一个字段。问题在于

dc_netif_filter_t netif = {DC_NETIF_SELECT_NAME,"tun0"}; 

我收到一个转换错误:从“const char*”到“uint32_t”的无效转换

谢谢

【问题讨论】:

  • 你只初始化一个联合体的成员。
  • 你不想初始化所有个联合体的成员;怎么样:dc_netif_filter_t netif = {DC_NETIF_SELECT_NAME, "tun"};
  • 那么我如何将 buf 设置为“tun”,然后将 0 设置为 itf_nb?
  • 你没有。工会不是结构。顺便说一句,您的代码看起来像 C,而不是 C++。
  • @trojanfoe 我得到“错误:从‘const char*’到‘uint32_t’的无效转换”

标签: c++ struct g++ unions


【解决方案1】:

正如编译器所说,too many initializers for ‘dc_netif_filter::< anonymous union>’

只初始化一个字段,而不是两个。

使用字段名正确初始化:

dc_netif_filter_t netif = {DC_NETIF_SELECT_NAME, { buf: "tun0" }}; 

【讨论】:

  • 如果我只初始化我对我的编辑感兴趣的字段(请参阅编辑的 OP)我收到转换错误
  • 我相信这是一个非标准的g++扩展。
  • @Nick 我不知道。它在 ISO C99 中称为Designated Initializers。在 C++ 中可能相同,但我不确定。
  • @Soohjun 谢谢,编辑后的版本有效!先生,你值得被爱;)
【解决方案2】:

看起来您正在尝试初始化结构以指示要使用buf 成员,并且该buf 的值应该是"tun"。由于C++11之前的C++缺少指定初始化器,所以不能用初始化器来做:只能初始化union的第一个字段,所以需要在代码中赋值:

static get_dc_netif_filter_t() {
    static c_netif_filter_t netif = {DC_NETIF_SELECT_NAME, {0}};
    if (netif.value.itf_nb == 0) {
        netif.value.buf = "tun";
    }
    return netif;
}

C++11 允许你这样做:

dc_netif_filter_t netif = {DC_NETIF_SELECT_NAME, { .buf = "tun"}};

【讨论】:

  • 我得到:'.' 标记之前的预期主表达式是否有我缺少的编译器选项?
  • @djfoxmccloud 试试-std=c++11
  • 这是不正确的。指定初始化器不在 C++11 中。它们目前是针对 C++20 提出的(参见 open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0329r4.pdf)。但是,它们目前似乎确实适用于 GCC、Clang 以及 MSVC。
【解决方案3】:

这适用于 g++ 4.7.0:

dc_netif_filter_t netif = {DC_NETIF_SELECT_NAME, {.buf="tun"}};

虽然指定的初始化器应该只是C,而不是C++!也许它是一个 GNU 扩展?

我猜最好(最兼容)的方式是在初始化后分配成员:

dc_netif_filter_t netif;
netif.itf_nb = DC_NETIF_SELECT_NAME;
netif.value.buf = "TUN";

【讨论】:

  • 我得到:'.' 标记之前的预期主表达式是否有我缺少的编译器选项?
  • 不,我没有使用命令行选项。我想它必须依赖于编译器版本;正如我所说,无论如何它都不应该在 C++ 中工作。
  • 我知道它不是“应该在 C++ 中工作”,问题是我需要“按原样”编译这段代码;)使用 g++ 4.4.3 它不起作用,我'将尝试升级
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
  • 2022-08-15
  • 2011-07-01
  • 2017-09-17
  • 2014-08-05
  • 2020-12-01
  • 1970-01-01
相关资源
最近更新 更多