c - 结构成员可能未初始化

标签 c gcc struct

我目前正在为 ESP8266 编写一个 WebSocket 守护进程。我目前正在为一个我无法解释的错误而苦苦挣扎。我定义了一个结构来保存 WebSocket 框架的所有信息

typedef struct {
    uint8_t flags;
    uint8_t opcode;
    uint8_t isMasked;
    uint64_t payloadLength;
    uint32_t maskingKey;
    char* payloadData;
} WSFrame;

然后我按照 IEEE RFC6455 sec 5.2 中的描述解析消息.然后我需要取消屏蔽数据,因为我是服务器。同样,IEEE RFC6455 sec 5.3在这里很有帮助。然而,xtensalx106 的编译器给我以下错误:

user/websocketd.c: In function 'wsRecvCb':
user/websocketd.c:104:11: error: 'frame.maskingKey' may be used uninitialized in this function [-Werror=maybe-uninitialized]
   WSFrame frame;
           ^
cc1: all warnings being treated as errors

对于下面的一段代码:

WSFrame frame;
parseWsFrame(data, &frame);

os_printf("payloadLength=%"PRIu64"\n", frame.payloadLength);
unmaskWsPayload(frame.payloadData, frame.payloadLength, frame.maskingKey);

即使 frame.maskingKey 是在 parseWSFrame 中定义的。

我监督什么?为什么它提示 'frame.maskingKey' 但确实提到错误是在初始化中?

如果我在 WSFrame frame; 定义之后立即执行 frame.maskingKey = 0;,编译器将关闭。但是,我不能声明 uint32_t maskingKey = 0;在我的结构定义中。

我不想使用任何堆分配,所以我不想 malloc 任何东西。

最佳答案

我认为这里的主要内容是编译时的 -Werror 标志,它将警告视为错误。如果您仍想保留该编译器标志,最好将 frame.maskingKey 初始化为 0,就像您所做的那样。

从不允许在结构声明中初始化结构成员。因此在结构声明中不可能执行 uint32_t maskingKey = 0

关于c - 结构成员可能未初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28751736/

相关文章:

c - 指向另一个结构中的结构的双指针

c++ - 将 struct 写入文件时写入了太多字节

用于生成/提取文件类型元数据(音频或图像或等)的 C 库

c - 在 Debian Linux 上使用 gcc 或 g++ 运行 C/C++ 代码时出错

c++ - 当 esp32 组件 #includes esp_types.h 在 newlib/not esp32/中找到时,esp-idf 构建闪存失败

c++ - 隐式调用不可访问的虚拟基类的构造函数

c++ - C++中如何删除struct数组中的元素

用gcc编译C文件得到x86汇编代码

c - 对 'gtk_source_buffer_new' 和 'gtk_source_view_new_with_buffer' 错误的 undefined reference

c - 在 C 中使用 argv 传递变量