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

C 在声明时初始化匿名联合内的字段,c,struct,initialization,unions,anonymous,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;

我有以下结构:

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是在匿名联合中的匿名结构中发现的


帮忙

cxt\u simple\u socket\u address\s
中不包含任何字段命名
。你是什么意思

cxt_simple_socket_address_t any = {ip.in = INADDR_ANY};

首先,您需要将
struct cs\u inaddr
的整个声明移动到
cxt\u simple\u socket\u address\t
之前,以使其可见

然后使用以下命令初始化:

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

还要注意,匿名联合是在
C11
中引入的,或者是作为
gcc
的扩展。

声明的第一顺序是错误的。
应首先声明
struct cs\u inaddr
,然后声明
struct cxt\u simple\u socket\u address\s

因为它是嵌套结构(编译器将首先查找
cs\u inaddr
的定义)

变量的初始化应如下所示:

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

注意
嵌套(内部)结构可以是匿名的,因为外部结构有一个标记名。

因此可以访问。

您应该在
中以归档方式引用
。它应该是这样的:
cxt\u simple\u socket\u address\u t any={.ip={.={.in=INADDR\u any}}但union和struct都是匿名的,只要声明了any,我就可以写:any.ip.in=INADDR\u any,它编译得很好,结构的顺序当然不是真实代码中的顺序。这只是为了让你理解我试图初始化的结构的结构。我正在使用gccThen
cxt\u simple\u socket\u address\u t any={.ip.in=INADDR\u any}进行编译将按预期工作。但它没有。我得到了以下错误:error:unknown字段–in–在初始化器cc1中指定:警告被视为错误src/simple\u socket\u tcp\u async.c:344:error:initializer src/simple\u socket\u tcp\u async周围缺少大括号。c:344:error:(接近对-any.ip.asp的初始化)您不需要这样的东西,
cxt\u simple\u socket\u address\u t any={.ip.in=INADDR\u any}
已经足够了:无论哪种方式,IMO
any={.ip={.in=INADDR\u any}更具描述性。仍然不适用于我。可能是由于编译差异,您得到的编译错误是什么?我使用
gcc FileName.c
编译。
cxt_simple_socket_address_t any = {.ip = {.in = 100}};
printf("%d\n", any.ip.in);