我一直在浏览有关在结构中初始化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
由于
答案 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";