我正在为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'
抱怨,但确实提到错误是在初始化中?
如果我在frame.maskingKey = 0;
的定义之后立即执行WSFrame frame;
,则编译器会关闭。但是,我不能声明uint32_t maskingKey = 0;在我的结构定义中。
我不想使用任何堆分配,所以我不想malloc任何东西。
答案 0 :(得分:1)
我认为这里的主要内容是编译时-Werror
标志,它将警告视为错误。如果您仍想保留该编译器标志,则最好将frame.maskingKey
初始化为0
,就像您一样。
永远不允许在结构声明中初始化结构成员。因此在结构声明中不可能做uint32_t maskingKey = 0
。