【问题标题】:initialization of a field inside an anonymous union, upon declaration在声明时初始化匿名联合中的字段
【发布时间】:2014-09-01 10:41:47
【问题描述】:

我有以下结构:

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。

帮助?

【问题讨论】:

  • 您应该依次引用in。应该是这样的:cxt_simple_socket_address_t any = {.ip = {.<UNION NAME> = {.<STRUCT NAME> = {.in = INADDR_ANY}}}};
  • 但是union和struct都是无名的

标签: c struct initialization unions anonymous


【解决方案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

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

【讨论】:

  • 你不需要这种东西,cxt_simple_socket_address_t any = {.ip.in = INADDR_ANY};就够了:ideone.com/zB7UJG
  • 不管怎样,IMO any = {.ip = {.in = INADDR_ANY }}; 更具描述性。
  • 仍然对我不起作用。可能是因为编译差异
  • 你得到什么编译错误?我使用gcc FileName.c编译。
【解决方案2】:

cxt_simple_socket_address_s 不包含任何命名为in 的字段。你是说

cxt_simple_socket_address_t any = {ip.in = INADDR_ANY};

?

【讨论】:

  • 一旦声明任何我可以写:any.ip.in = INADDR_ANY 并且编译正常
【解决方案3】:

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

然后使用初始化:

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

另请注意,匿名联合是在 C11gcc 扩展中引入的。

【讨论】:

  • 结构顺序当然不是真实代码中的。这只是为了让您了解我要初始化的结构的结构。我正在用 gcc 编译
  • 然后cxt_simple_socket_address_t any = {.ip.in = INADDR_ANY}; 将按预期工作。
  • 嗯,它没有。我收到以下错误:错误:在初始化程序 cc1 中指定的未知字段âinâ:警告被视为错误 src/simple_socket_tcp_async.c:344:错误:初始化程序 src/simple_socket_tcp_async.c:344 周围缺少大括号:错误:(âany 的近初始化.ip.a)
猜你喜欢
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多