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,它编译得很好,结构的顺序当然不是真实代码中的顺序。这只是为了让你理解我试图初始化的结构的结构。我正在使用gccThencxt\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}
已经足够了:无论哪种方式,IMOany={.ip={.in=INADDR\u any}代码>更具描述性。仍然不适用于我。可能是由于编译差异,您得到的编译错误是什么?我使用gcc FileName.c
编译。
cxt_simple_socket_address_t any = {.ip = {.in = 100}};
printf("%d\n", any.ip.in);