ESP8266 SPI代码编译警告:需为|操作数的算术运算加括号
代码语法警告原因及解决方法
第一处警告:&dout_data位置的优先级问题
警告代码片段:
WRITE_PERI_REG(SPI_W0(spi_no),((0xFFFFFFFF<<(dout_bits-dout_extra_bits)&dout_data)<<(8-dout_extra_bits)| (0xFFFFFFFF>>(32-(dout_bits-dout_extra_bits)))&dout_data)); ^
问题原因:
C语言中移位运算符(<</>>)优先级高于按位与(&),但代码未给移位操作结果加括号,尽管运算顺序符合语法,新版本编译器会判定为写法模糊,触发警告。旧版本SDK的编译器默认未启用这类严格警告规则,因此无提示。
修复代码:
给移位操作结果包裹括号,明确运算顺序:
WRITE_PERI_REG(SPI_W0(spi_no),(((0xFFFFFFFF<<(dout_bits-dout_extra_bits))&dout_data)<<(8-dout_extra_bits)| ((0xFFFFFFFF>>(32-(dout_bits-dout_extra_bits)))&dout_data)));
第二处警告:command&位置的优先级问题
警告代码片段:
WRITE_PERI_REG (SPI_USER2 (spi_no),((((cmd_bits-1)&SPI_USR_COMMAND_BITLEN)<<SPI_USR_COMMAND_BITLEN_S)| command&SPI_USR_COMMAND_VALUE)); ^
问题原因:
按位与(&)优先级高于按位或(|),代码中command&SPI_USR_COMMAND_VALUE的运算顺序虽正确,但新版本编译器会因缺少括号导致可读性差、逻辑模糊而触发警告。旧版本SDK编译规则更宽松,未检测这类问题。
修复代码:
给command&SPI_USR_COMMAND_VALUE包裹括号,明确其作为按位或的右操作数:
WRITE_PERI_REG (SPI_USER2 (spi_no),((((cmd_bits-1)&SPI_USR_COMMAND_BITLEN)<<SPI_USR_COMMAND_BITLEN_S)| (command&SPI_USR_COMMAND_VALUE)));
旧版本SDK无警告的原因
旧版本SDK使用的编译器或编译选项默认未启用严格语法检查(如-Wparentheses、-Wall这类警告开关),对运算符优先级模糊的写法不做提示;新版本SDK升级了编译器或调整了编译规则,开启这类代码风格警告,旨在避免潜在逻辑错误、提升代码可读性。
内容的提问来源于stack exchange,提问作者Murad
相关产品推荐
相关产品推荐

