IAR、KEIL常见编译报错警告的解决方法(持续更新中)

  1. “Warning[Pe550]: variable “变量” was set but never
    used”
    原因:变量定义赋值了但从未使用
    解决:变量定义删了就可以,编译器也不会真的给这个变量分配空间

  2. Warning[Pe223]: function “函数名” declared implicitly "
    原因:这个函数隐式声明。意思是在他调用的地方找不到函数原型。
    解决:在调用的地方增加相应函数头文件的函数原型申明。"

  3. Warning[Pe177]: function “函数名” was declared but never referenced 定义了这个函数没有用
    原因:定义了这个函数没有用

  4. Warning :546: transfer of control bypasses initialization of:
    原因:初始化被绕过
    解决:检查报错的

  5. warning: #191-D: type qualifier is meaningless on cast type
    原因:类型限定符对类型转换没有意义

  6. Warning[Pa089]: enumerated type mixed with another enumerated type
    原因:枚举类型与另一个枚举类型混合

  7. error: #if with no expression
    原因:#if 没有表达,代码举例如下:

#define TEST_A//这里只定义了这个宏,但没有具体给出值,就会报错

#if TEST_A
#define TEST_NUMBER 1
#else
#define TEST_NUMBER 2
#endif

解决:检查下代码,看到底想用的是#if还是#ifdef,#if的话宏定义需要定义个值才行


  1. “Remark[Pe193]: zero used for undefined preprocessing identifier"宏定义名”
    原因:未定义的预处理标识符。这个是最近开发遇到的一个很严重且隐蔽的问题,代码举例如下:
#include <stdio.h>

//#define TEST_A//这个宏定义没有被定义或是在其他.h中被定义但没有被这个文件引用

#if TEST_A
#define TEST_NUMBER 1
#else
#define TEST_NUMBER 2
#endif

int main()
{
    
    

	printf("test number:%d\n", TEST_NUMBER);
   
   return 0;
}
结果是编译不报错,输出 test number:2

如果代码中宏定义TEST_A是在别的.h中定义,但当前代码并未正确引用这个.h,编译器在编译这里时是认为TEST_A这个宏定义不存在的,但#if的宏不存在时并不会报错,甚至警告也没有,只是一个Remark提示。
当我们以为此处的TEST_NUMBER是受TEST_A宏控制的,其实并没有。

解决:与上一条类似,检查代码看到底想用的是#if还是#ifdef,并添加引用定义这个宏的头文件。

猜你喜欢

转载自blog.csdn.net/weixin_43854928/article/details/120537893