簡體   English   中英

gcc 結構分配警告缺少初始化器周圍的大括號

[英]gcc struct assignment warning missing braces around initializer

結構 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};
      |                                             ^
                                         ^

為什么? 我該如何修復代碼?

  1. INADDR_ANY 是宏定義的。
  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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM