【问题标题】:gcc struct assignment warning missing braces around initializergcc 结构赋值警告缺少初始化器周围的大括号
【发布时间】:2020-12-10 10:34:12
【问题描述】:

struct rtentry

以下

#include <net/route.h>
#include <netinet/in.h>
int main(){
  struct rtentry e={};
  *((struct sockaddr_in*)(&(e.rt_genmask)))=(struct sockaddr_in){.sin_family=AF_INET,.sin_port=0,.sin_addr=INADDR_ANY};
  return 0;
}

给出警告 (gcc -std=c11 -Wall test.c)

test.c:5:45: warning: missing braces around initializer [-Wmissing-braces]
    5 |   *((struct sockaddr_in*)(&(e.rt_genmask)))=(struct sockaddr_in){.sin_family=AF_INET,.sin_port=0,.sin_addr=INADDR_ANY};
      |                                             ^
                                         ^

为什么?如何修复代码?

【问题讨论】:

  • rtentyrtentry?我在 route.h 中找到了后者。
  • 如果我使用 C 编译器,它会编译。 godbolt.org/z/xKETe3 。但是如果我切换到 C++ 编译器,就会出现错误而不是警告。
  • @LouisGo -Wall
  • .sin_addr={INADDR_ANY} - sin_addr 是一个组合。这也将使它对 c++ 友好。

标签: c gcc struct gcc-warning


【解决方案1】:
  1. INADDR_ANY is macro defined
  2. in_addr 是用于包装值的结构。 您需要使用.sin_addr={INADDR_ANY} 来确保它是由值INADDR_ANY 初始化的。
           struct sockaddr_in {
               sa_family_t    sin_family; /* address family: AF_INET */
               in_port_t      sin_port;   /* port in network byte order */
               struct in_addr sin_addr;   /* internet address */
           };

           /* Internet address. */
           struct in_addr {
               uint32_t       s_addr;     /* address in network byte order */
           };

固定:https://godbolt.org/z/xM8r1E

#include <net/route.h>

int main(void) {
    struct rtentry e={};
    *(struct sockaddr_in*)(&(e.rt_dst))=(struct sockaddr_in){
    .sin_family=AF_INET,
    .sin_port=0,
    .sin_addr={INADDR_ANY}
    };
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    相关资源
    最近更新 更多