我目前正在为 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/