C++ 结构中的联合初始化
我一直在浏览stackoverflow关于在结构中初始化联合的问题,但我没有设法使它正确 这是我的结构C++ 结构中的联合初始化,c++,struct,g++,unions,C++,Struct,G++,Unions,我一直在浏览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
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\u t”的标量初始值设定项周围有大括号
及
这会产生错误:“dc\u netif\u筛选器::dc_netif_filter_t netif = {DC_NETIF_SELECT_NAME,"tun0"};
我收到一个转换错误:从“const char*”到“uint32\t”的转换无效
谢谢正如编译器所说,
对于“dc\u netif\u过滤器::”的初始值设定项太多了
仅初始化一个字段,而不是同时初始化两个字段
使用字段的名称对其进行正确初始化:
dc_netif_filter_t netif = {DC_NETIF_SELECT_NAME, { buf: "tun0" }};
这在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";
看起来您正在尝试初始化结构,以指示要使用buf
成员,并且buf
的值应为“tun”
。因为C++ 11之前C++缺少指定的初始化器,所以不能用初始化器来完成:只有初始化<<代码>联合< /COD>的第一个字段,所以需要在代码中执行赋值:
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"}};
您只初始化工会的一个成员。您不想初始化工会的所有成员;怎么样:dc\u netif\u filter\u t netif={dc\u netif\u SELECT\u NAME,“tun”}代码>那么如何将buf设置为“tun”,然后将0设置为itf_nb?您不需要。工会不是组织。顺便说一句,你的代码看起来像C,而不是C++。@ TROJANFOE,我得到了“错误:从‘const char’到‘uTIN 32’t的无效转换”,如果我只初始化我感兴趣的领域,我的编辑是什么(见OP编辑),我得到一个转换,错误地认为这是一个非标准的G+扩展。@ Nick我不知道。在ISO C99中,它被称为指定初始值设定项。可能在C++中是一样的,但我不确定。先生,你应该得到一些爱;)我得到:应在“.”之前使用主表达式。是否缺少编译器选项?@djfoxmccloud try-std=c++11
这是不正确的。指定的初始值设定项不在C++11中。它们目前是针对C++20提出的(请参阅)。但是,它们目前似乎在GCC、Clang和MSVC中都能工作。我得到:“.”之前应该有主表达式。令牌是否缺少编译器选项?不,我没有使用命令行选项。我猜它一定是依赖于编译器的版本;正如我所说的,它不应该在C++中工作。我理解它不是“应该在C++中工作”,而是需要编译这个代码“原样”;如果g++4.4.3不起作用,我将尝试升级
dc_netif_filter_t netif = {DC_NETIF_SELECT_NAME, { .buf = "tun"}};