c++ - 在 gcc linux 中编译时出现一堆错误和警告

标签 c++ c gcc gnu compiler-warnings

<分区>

这段代码几个月前编译无误。我丢失了 VM 镜像,因此我使用最新的 GCC 和库设置了一个新的 Linux VM。但现在我收到了这些错误和警告。

In file included from /opt/Espressif/ESP8266_SDK/include/ets_sys.h:12:0,
                 from include/espmissingincludes.h:4,
                 from driver/i2c.c:20:
driver/i2c.c: In function 'i2c_init':
/opt/Espressif/ESP8266_SDK/include/eagle_soc.h:247:94: error: suggest parentheses around arithmetic in operand of '|' [-Werror=parentheses]
 #define PIN_FUNC_SELECT(PIN_NAME, FUNC)  do {WRITE_PERI_REG(PIN_NAME,READ_PERI_REG(PIN_NAME) & (~(PERIPHS_IO_MUX_FUNC<<PERIPHS_IO_MUX_FUNC_S)) |( (((FUNC&BIT2)<<2)|(FUNC&0x3))<<PERIPHS_IO_MUX_FUNC_S) );} while (0)
                                                                                              ^
/opt/Espressif/ESP8266_SDK/include/eagle_soc.h:50:87: note: in definition of macro 'WRITE_PERI_REG'
 #define WRITE_PERI_REG(addr, val) (*((volatile uint32_t *)ETS_UNCACHED_ADDR(addr))) =(val)
                                                                                       ^
driver/i2c.c:64:5: note: in expansion of macro 'PIN_FUNC_SELECT'
     PIN_FUNC_SELECT(I2C_SDA_MUX, I2C_SDA_FUNC);
     ^
/opt/Espressif/ESP8266_SDK/include/eagle_soc.h:247:94: error: suggest parentheses around arithmetic in operand of '|' [-Werror=parentheses]
 #define PIN_FUNC_SELECT(PIN_NAME, FUNC)  do {WRITE_PERI_REG(PIN_NAME,READ_PERI_REG(PIN_NAME) & (~(PERIPHS_IO_MUX_FUNC<<PERIPHS_IO_MUX_FUNC_S)) |( (((FUNC&BIT2)<<2)|(FUNC&0x3))<<PERIPHS_IO_MUX_FUNC_S) );} while (0)
                                                                                              ^
/opt/Espressif/ESP8266_SDK/include/eagle_soc.h:50:87: note: in definition of macro 'WRITE_PERI_REG'
 #define WRITE_PERI_REG(addr, val) (*((volatile uint32_t *)ETS_UNCACHED_ADDR(addr))) =(val)
                                                                                       ^
driver/i2c.c:65:5: note: in expansion of macro 'PIN_FUNC_SELECT'
     PIN_FUNC_SELECT(I2C_SCK_MUX, I2C_SCK_FUNC);
     ^
cc1: all warnings being treated as errors
make: *** [build/driver/i2c.o] Error 1

有谁知道如何解决这些问题吗?

最佳答案

您将警告视为错误,大概是通过使用 -Werror 进行构建。如果删除该标志或添加 -Wno-error=parentheses,代码应该可以编译。

但是,如果代码是您的(而不是看起来在第 3 方库中),则值得修复根本原因。您可以通过在正确的位置添加括号来在宏中修复它,但我认为让这些宏成为真正的函数会更好。

关于c++ - 在 gcc linux 中编译时出现一堆错误和警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31284937/

相关文章:

c - 包含不导入的指令

c++ - 子进程为 cmd 时 GenerateConsoleCtrlEvent 崩溃

c++ - 使用C++在OS X上动态链接SQLCipher

c++ - 对 std::pair 的 vector 进行排序

c - 退出函数后出现段错误

用于求解稀疏线性方程组的 C API 库?

c - 我需要做什么才能链接到 xlib?

c++ - OpenCV Python 通过图像数据绑定(bind)非常慢的迭代

c - 如何使用 clang 和安全堆栈标志编译可执行文件

c++ - Boost预编译头文件问题