c - gcc 结构赋值警告缺少初始化器周围的大括号
问题描述
以下
#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};
| ^
^
为什么?我该如何修复代码?
解决方案
- INADDR_ANY 是宏定义的。
in_addr
是用于包装值的结构。您需要使用.sin_addr={INADDR_ANY}
它来确保它由 value 初始化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;
}
推荐阅读
- ios - 通过按钮将文本插入textView然后删除
- javascript - 身份验证后重定向到 Passport.js 中的上一页(不重复)Node.js
- reactjs - 在单个 setState 调用上多次响应状态更新
- pascal - 无法编译 - Turbo Pascal
- mysql - 在 Ubuntu 20.04 上从 MySQL 迁移到 MariaDB
- javascript - d3.js 轴添加刻度值
- git - 写入 node_modules 目录时的管道权限问题
- c++ - 编译错误:Boost.Range / MPL 中没有名为“type”的类型
- java - 构造转换器失败:错误:无法解析 C:
- java - 将类的实例转换为服务(android/Java)时的问题