Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 结构中的联合初始化_C++_Struct_G++_Unions - Fatal编程技术网

C++ 结构中的联合初始化

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

我一直在浏览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\u t”的标量初始值设定项周围有大括号

这会产生错误:“dc\u netif\u筛选器::的初始值设定项太多”

我如何声明这样的dc\u netif\u过滤器

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

**编辑:如前所述,我只能初始化一个字段。问题是我们的

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"}};