最近在使用STM32CubeMX生成MDK工程是,使用了 AC6 版本的编译器进行编译代码,然后发现了一些警告,但是在 AC5 版本下编译又正常。于是研究了下怎么屏蔽特定的警告,这里记录一下。
1. Keil AC6屏蔽特定警告
遇到的警告如下:
这里说,这个表达式的返回值没有被使用。这个警告在 AC5 版本编译器是不会出现的,但是使用AC6版本编译器就出现了,而且是ST提供的库函数引入的警告。
要消除这个警告,需要去查找 ARM C/C++ AC6版本的编译器用户文档,它的官网如下:
https://developer.arm.com/documentation/101407/0538/Dialogs/Project/Options/Compiler/Arm-C-C----AC6–Compiler
下面的描述是AC6的文档描述:
# 所有警告— 是 uVision 默认设置。显示所有诊断 ( -Weverything ) 并排除 ( -Wno-xxx ) 编译器控制字符串中列出的诊断:
-Weverything
-Wno-reserved-id-macro
-Wno-unused-macros
-Wno-documentation-unknown-command
-Wno-documentation
-Wno-reserved-identifier(适用于 Arm Compiler 6.17 及更高版本)
# AC5 类似警告— 显示 ARM 编译器 5 将显示的所有警告。抑制以下警告:
-Wno-missing-variable-declarations
-Wno-missing-prototypes
-Wno-missing-noreturn
-Wno-sign-conversion
-Wnonportable-include-path
-Wno-packed
-Wno-reserved-id-macro
-Wno-unused-macros
-Wno-documentation-unknown-command
-Wno-documentation
-Wno-license-management
-Wno-parentheses-equality
-Wno-reserved-identifier(适用于 Arm Compiler 6.17 及更高版本)
大概意思就是,可以在 Keil 的配置选项中配置: -Wno-xxx 这样格式的命令,就可以忽略某种警告了。xxx 指的就是警告的类型,比如上面我截图遇到的警告 [-Wunused-value]
要忽略这个警告,那么只要在Keil的配置界面添加 :-Wno-unused-value 这条命令即可。
又比如说,下面的宏定义重复定义了的警告:
那么我们输入: -Wno-macro-redefined 这条命令,就可以忽略宏定义重复定义的警告了。
用法总结:
-Wno-<警告类型>
这个警告类型我们可以看编译器给出的警告类型。
2. Keil AC5屏蔽特定警告
AC5版本编译器屏蔽特定警告的方式,有点区别。只要在Keil的配置选项中添加下面的指令:
--diag_suppress=<警告码>
这个警告码,编译器会给出的,比如我下面的编译警告,说我的宏定义重复定义了,还要变量c定义了,但是从来都没有使用。编译器给出的警告码就是 47 和 550,如下图:
如果想忽略的话,那么就可以填写如下指令:
--diag_suppress=47 --diag_suppress=550
3. IAR屏蔽特定警告
IAR编译器警告如下:
说我这里有变量定义了没有使用,还有宏定义重名了。
IAR工程屏蔽特定警告方法,只要在工程配置填入所需要屏蔽的警告类型就行了,比如上面报的警告类型,Pa181 和 Pe177 ,那么在工程配置如下:
这样就能屏蔽IAR工程的特定警告了。