在声明时初始化匿名联合内的字段

时间:2014-09-01 10:41:48

标签: c struct initialization unions anonymous

我有以下结构:

typedef struct cxt_simple_socket_address_s
{
        int is_ipv6;
        cs_inaddr_t ip;
        unsigned short ip_port;
} cxt_simple_socket_address_t;

typedef struct cs_inaddr
{
        union {
            struct in6_addr in6;
            struct
            {
                uint8_t pad[12];
                uint32_t in;
            };
            long long as_longs[2];
        };
} cs_inaddr_t;

我想在声明时初始化类型为cxt_simple_socket_address_t的结构:

cxt_simple_socket_address_t any = {.in = INADDR_ANY};

这一行没有编译。我尝试了无数其他变体,但我相信我的问题不是.in是在匿名联盟内的匿名结构中找到的。

HELP?

3 个答案:

答案 0 :(得分:1)

首先,声明的顺序是错误的 应首先声明struct cs_inaddr,然后struct cxt_simple_socket_address_s 由于它是嵌套的结构(编译器将首先查找cs_inaddr的定义)。

typedef struct cs_inaddr
{
    union {
        struct in6_addr in6;
        struct
        {
            unsigned char pad[12];
            unsigned int in;
        };
        long long as_longs[2];
    };
} cs_inaddr_t;

typedef struct cxt_simple_socket_address_s
{
    int is_ipv6;
    cs_inaddr_t ip;
    unsigned short ip_port;
} cxt_simple_socket_address_t;

变量的初始化应为:

cxt_simple_socket_address_t any = {.ip = {.in = INADDR_ANY}};

使用以下方法对其进行测试:

cxt_simple_socket_address_t any = {.ip = {.in = 100}};
printf("%d\n", any.ip.in);

输出:100

注意
嵌套(内部)结构可以是匿名的,因为外部结构具有标记名称 因此可以访问。

答案 1 :(得分:0)

cxt_simple_socket_address_s不包含任何字段命名in。你的意思是

cxt_simple_socket_address_t any = {ip.in = INADDR_ANY};

答案 2 :(得分:0)

首先,您需要在struct cs_inaddr之前移动cxt_simple_socket_address_t的整个声明,以使其可见。

然后使用:

初始化
cxt_simple_socket_address_t any = {.ip.in = INADDR_ANY};

另请注意,匿名联盟会在C11gcc扩展名中引入。