概述
图一 Warning
图二 NoWarning
Keil中出现warning: #160-D: unrecognized #pragma这样的错误怎么解决?
答:每一种开发环境支持的#pragma是不一样的。不支持的就不能用了,例如图一中的message。
Keil编译代码时可选的警告类型很多,针对同一套代码,不同的警告代码设置下,编译器编译后给出的警告不同。
基于这一点,调试时完全可以故意让编译器报错来告知你其它信息,例如:当代码中有多个条件编译时,你想知道你的编译器是否按照你的意愿在执行,故可在每个宏之前加入不同的警告信息,从而根据编译后的警告信息来得知代码的执行方式。
例如有三个关于串口的宏,每个宏条件下串口处理的方式不一样。
xx.h文件中宏定义:
#define NIBP_CLINIC
#define UART_CMD
#define UART_PRINTF
xx.c中根据不同的宏采取不同的策略
#if defined NIBP_CLINIC
#program message(“###########”)
Xxxx;
Xxxx;
#elif defined UART_CMD
#program message(“@@@@@@@@@”)
Xxxxx;
Xxxxx;
#elif defined UART_PRINTF
#program message(“$$$$$$$$$$$$$$”)
Xxxx;
Xxxx;
#else
#program message(“%%%%%%%%%”)
Xxxx;
Xxxx;
#endif
常见的几种警告信息:
1.warning: #1295-D: Deprecated declaration run_c - give arg types
void run_c();//原函数
void run_c(void);//改正后
对比前面声明的函数,发现是括号少了一个void,因为我的函数是不带参的,不加void会有警告的,往括号里加了void之后,重新编译之后警告消失。
2.warning: #940-D: missing return statement at end of non-void function "Gray_Delay_Run40"
int Gray_Delay_Run40(u16 i)//原函数
{
while(i -- )
{
delay_ms(1);
Gray_Run40();
}
}
int Gray_Delay_Run40(u16 i)//改正1
{
while(i -- )
{
delay_ms(1);
Gray_Run40();
}
return 0;
}
void Gray_Delay_Run40(u16 i)//改正2
{
while(i -- )
{
delay_ms(1);
Gray_Run40();
}
}
因为我函数是int型的,是需要有返回值,但是我没有return,加入return 0;之后重新编译警告消失。或者直接把int改成void,同样编译后警告消失。
3.warning: #177-D: variable "a" was declared but never referenced
s32 a = 50;//原函数
//s32 a = 50;//改正后
因为我定义了一个变量准备在后面用到,但是后面直接用数字代替了,没有用到,将这个变量注释后,重新编译警告消失。
4.warning: #128-D: loop is not reachable
这个警告的意思是我无法跳出这个循环,我跳到这行看,发现的确少了一个break,加入之后重新编译,警告消失!
5.error: At end of source: #67: expected a "}"
这个错误很明显,就是说少了一个括号,因为我是一部分一部分调试的,调试完一部分注释,最后全部恢复优化,就报了这个错误,至于在哪里不知道,因为一点错误直接跳转到最后一行,但是我这个循环里面有上千条代码,一条一条慢慢过去找不现实。解决办法是二分法查找,先注释上半部分代码,没了错误,那肯定就是在上半部分少了"}",继续二分法,最后几十行看看就知道错在哪里了,加上括号,重新编译错误解决!
最后
以上就是淡定红酒为你收集整理的Keil5调试代码时关于警告及错误信息的处理的全部内容,希望文章能够帮你解决Keil5调试代码时关于警告及错误信息的处理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复