我有以下结构:
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?
答案 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};
另请注意,匿名联盟会在C11
或gcc
扩展名中引入。