结构中的联合初始化

时间:2012-04-16 13:20:50

标签: c++ struct g++ unions

我一直在浏览有关在结构中初始化union的问题的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

由于

3 个答案:

答案 0 :(得分:6)

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

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

使用字段名称正确初始化它:

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

答案 1 :(得分: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"}};

答案 2 :(得分:1)

这适用于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";