|
Keil编译常见问题(一) warning: #1295-D: warning: #1295-D: Deprecated declaration ShowSendTime - give arg types: [1 A: A# _$ H: g N 解决方法:将void ShowSendTime()改为void ShowSendTime(void) warning: #550-D:warning: #550-D: variable "d" was set but never used 描述:变量'd'定义但从未使用,或者是,虽然这个变量你使用了,但编译器认为变量d所在的语句没有意义,编译器把它优化了. 解决:仔细衡量所定义的变量d是否有用,若是认定变量d所在语句有意义,那么尝试用volatile关键字修饰变量d,若是真的没有用,那么删除掉以释放可能的内存. error: #159:你的固件库里的库文件没有添加进工程里面,所以出现未定义的情况。 E( P2 n- f3 d, E& O( i! @% X0 u TIM2_IRQChannel指定时器2的中断通道没有定义,其实在固件库对这些参数都有定义,宏定义代替了一串寄存器地址数据。需要将.C文件添加到工程文件中解决方法:在函数a调用函数b之前,对函数b进行声明,如:$ E" g$ |5 |; M$ H void b(void); //对函数b进行声明( t2 R) ~: }8 i) o void a(void) //函数a的实体& |' N; G4 g' D" y! X { b(); //调用函数b } void b(void) //函数b的实体 { ... } error: #70:error: #70: incomplete type is not allowed 你的固件库里的库文件没有添加进工程里面,所以出现未定义的情况。; |" f/ b2 U7 U" O; l" Q- L TIM2_IRQChannel指定时器2的中断通道没有定义,其实在固件库对这些参数都有定义,宏定义代替了一串寄存器地址数据。需要将.C文件添加到工程文件中7 D3 a/ o' B/ k- c9 Y , N# x; ]) B& W& X* X N2 h warning: #550-D:1.warning: #550-D: variable "d" was set but never used, E, v$ q* y# ^7 w- A1 s6 q; ]+ S& M! v 描述:变量'd'定义但从未使用,或者是,虽然这个变量你使用了,但编译器认为变量d所在的语句没有意义,编译器把它优化了. 解决:仔细衡量所定义的变量d是否有用,若是认定变量d所在语句有意义,那么尝试用volatile关键字修饰变量d,若是真的没有用,那么删除掉以释放可能的内存.! A1 m' Y9 A! ~ q2 k0 Y6 y warning: #1-D:2.warning: #1-D: last line of file ends without a newline. O% Y e2 K9 m0 b 描述:文件最后一行不是新的一行.编译器要求程序文件的最后一行必须是空行,想了半天没想通为什么要这样.7 `2 t/ U* {7 E' k7 s4 y& L 解决:可以不理会.若是觉得出现警告不爽,那么在出现警告的文件的最后一行敲个回车,空出一行. warning: #111-D:3. warning: #111-D: statement is unreachable 描述:声明不可能到达.多出现在这种场合:2 ~/ v3 t; B4 p) u+ K int main(void) {1 p( c i4 N u ...4 l# m- o2 p: _9 F7 f, L Z" `' ?- N $ C$ @) K* J' G while(1) //无限循环,这在不使用操作系统的程序中最常见* ]( X6 r) n' G2 U {& c {3 Y( P* Z% ~' V ... }4 R4 L8 {6 O* {& @ return 0; //这句声明在正常情况下不可能执行到,编译器发出警告 } 7 u% C2 k! G% k& j6 G2 o 解决:不理会., P- l7 t% K: t$ J2 G # a- h( C$ a; Z# [1 z ' P/ J/ e+ N; O) U0 B% y. ? warning: C3017W:4. warning: C3017W: data may be used before being set 描述:变量'data'在使用前没有明确的赋值.如: uint8 i,data; //定义变量i和data,二者都没有明确赋值 for ( i = 0; i < 8; i++) //变量'i'在语句中被赋值0 {9 K) X n5 J) N5 d5 L* B: ` if ( IO1PIN & SO_CC2420 ) data |= 0x01; //变量'data'在使用前没有明确赋值,编译器发出警告) M8 u' Y+ v6 r" l7 W# l" g else data &= ~0x01; }' q/ {; Q' {. p. j 解决:应仔细衡量该变量的初始值是否为0,若是,可以不理会这个警告,因为MDK编译器在程序执行前,会将使用到的数据区初始化为0,但若是该变量的初始值不应该是0,忽略这个警告可能会引起致命错误.这个警告应引起足够重视.应养成变量赋初值的习惯,好在有编译器给把关. warning: #177-D:5. warning: #177-D: variable "temp" was declared but never referenced 描述:变量'temp'进行了声明但没有引用.多出现在声明了一个变量,但却没有使用它,它和warning: #550-D: variable "temp" was set but never used不同之处在于temp从没有使用过. 解决:若是定义的变量确实没有用,删除掉;若是有用,则在程序中使用. 与该警告类似的还有 warning: #177-D: function "MACProcessBeacon" was declared but never referenced warning: #940-D:6. warning: #940-D: missing return statement at end of non-void function "DealwithInspect2", j# n5 Q- Q8 P7 B# `$ y 描述:返回非空的函数"DealwithInspect2"的最后缺少返回值声明.如: int DealwithInspect2(uint32 test): X. a5 ^# j7 I( e7 Z { ... ... ... //此处应该是return x;返回一个int型数据,若是没有返回值,编译器产生警告 } 2 J* ]8 }6 F! ]1 J9 Q9 W .warning: #1295-D:7..warning: #1295-D: Deprecated declaration lcd_init - give arg types 描述:在定义函数的时候,如果你写上函数参数,就会有这个警告,比如void timer_init(); 这里就没有形参,如果这样的话,编译器会给出警告. * ~. t' T+ g' @ error: #65:1. error: #65: expected a ";" 描述:缺少分号.大多是漏忘';'./ k, v3 T. X" n: Y6 T1 i 解决:双击错误行,在定位到错误点的附近找到没加';'号的语句,加上分号.并不一定在定位到的错误行才却分号,可能是这行的上一行,也可能是下一行. ) X0 A. u6 u4 t: j% h6 D error: #65: error: #202. error: #65: expected a ";"和 error: #20: identifier "xxxx" is undefined一块出现,而且后面的error: #20错误可能一大堆; m6 H' I" g+ E' v/ w: l- Z' @$ @ 描述:这个错误对于第一次遇上的人来说绝对是个噩梦,当错误出现,满怀希望的双击错误提示,来到错误行时却愕然发现,错误行绝对没有错,于是找找错误行的上一行,下一行,没有错误,再找上上行,下下行...让人无比郁闷的事情出现了:编译提示的所有错误行都不可能有错误出现.其实这最可能是你在.h文件声明外部变量或者函数时,没有在声明语句的最后加分号!如果你有很多模块,如main.c,lcd.c,key.c...有很多头文件,如lcd.h,key.h,若是在lcd.h文件声明函数时没有加分号,那么这种错误可能定为到main.c中,所以要检查所有头文件. 解决:仔细检查.h文件,将分号补上. / h- i% S5 R% e R" u Error: L6200E:3. Error: L6200E: Symbol flagu multiply defined (by uart0.o and main.o). # l5 H0 B1 x! b+ q6 @6 N5 w 描述:变量(也是一种符号)flagu多处定义(在uart0.c中和main.c都定义了).通常错在全局变量定义重复.比如:在main.c中定义全局变量flagu:1 t# E6 h( V( L! O5 |4 S% L uint8 flagu=0; / L" g# t7 }4 p$ a; } 在uart0.c中也用到该变量,于是声明此变量,我通常都是先复制定义的变量再在变量前面加关键字extern修饰: Q' ^$ V6 Y6 Q3 c7 E4 V extern uint8 flagu=0;# m) s b" E; x: G5 r* ~# K 2 z% U6 R7 _, U/ @$ Q( e 然后编译,就会出现上面的连接错误,原因在于,我在uart0.c中是又定义了一个变量,而不是声明变量,因为我给变量赋了初值"flagu=0",这样就重复定义了变量flag.正确的声明方法是去掉赋值部分:! N$ U# ?: X2 U8 D8 \; S % Y7 ~% l! s/ L8 z5 `' c extern uint8 flagu; 5 k/ R" F9 `, V 解决办法:找到重复定义的变量,看情况修改一处.6 ~$ ?, u( `; w! u3 H; ], b! d , N+ Q2 n1 G6 q1 ~ error: #159:4.error: #159: declaration is incompatible with previous "wr_lcd" (declared at line 40): l0 H: ?2 E$ B 描述:在wr_lcd函数还没有声明之前就已经使用了.多出现在两种情况:第一种,wr_lcd函数体还没有写,就已经用到了它,这种情况多出现在写一个程序的大体结构中,只是简单写一下框架.第二种情况比较常见,函数a调用函数b,但函数b的函数体在函数a的下面:5 \6 J# } a- k+ F; }; n5 H8 j& m void a(void) //函数a的实体0 R9 ?9 P7 T- I T { S+ V& A1 U7 h1 C! H; n' h b(); //调用函数b B' Y F" c3 D2 A }. Q1 @ w( Q& [! }. k% D- T B7 S void b(void) //函数b的实体6 s4 `+ c' |+ E; C9 q6 C { ...9 C5 n. d: p/ ^# Y }: ]1 {1 W& `; H) d- y5 J 这样如果点编译,就会产生error: #159的错误,因为当函数a调用函数b时,发现在这之前都没有函数b的任何声明. 解决方法:在函数a调用函数b之前,对函数b进行声明,如: void b(void); //对函数b进行声明 void a(void) //函数a的实体 {8 S+ O+ ~- H$ ?+ F& k6 E2 [9 \ b(); //调用函数b4 a9 I7 n) q, n% j/ I7 N% F% M* c } ! |. H- A8 Z2 e7 E* _ void b(void) //函数b的实体 { ...9 E$ m% t2 g5 q q& s# m1 t4 o }! j! d' ^2 E# h( o1 k ) l/ o# j/ N$ ~. e8 f error: #137:5. error: #137: expression must be a modifiable lvalue 描述:表达式必须是一个可以修改的左值.主要出现在这种现象: 9 I" p+ Y! E. O0 s4 E* c1 v3 E a=NUM; : n& u1 }2 W- h# I NUM是一个数值或表达式,a为一个变量,但a被定义为像const这种不可更改的类型,导致NUM不能赋值给变量a.+ h1 }& l: m, b 解决方法:要么放弃赋值,要么修改变量属性.6 ]' l6 Z( j1 s; B0 T error: #1113: 你的固件库里的库文件没有添加进工程里面,所以出现未定义的情况。 TIM2_IRQChannel指定时器2的中断通道没有定义,其实在固件库对这些参数都有定义,宏定义代替了一串寄存器地址数据。需要将.C文件添加到工程文件中__asm放到一个单独的子函数再被调用就没问题了 如下: __asm void nop(void)$ j' _$ k5 y+ a* \/ O: k4 Z {8 q, N+ Q( F: } NOP9 l' M# L/ t+ ?& o2 U } 然后在之后的C代码中调用该函数:/ d; d& n* q! i9 R# n. e* y void main(); Z. F1 e3 Y* o2 F+ t { ... nop();! T1 K6 m8 e! X7 ?4 P' P% B- v ... } |
| 不错不错,支持下 |
![]() ![]() ![]() ![]() ![]() ![]() ![]() |
| 两个都是楼主发的啊 |
| 很不错的 |
![]() ![]() ![]() ![]() ![]() |
| 我是来学习的。 |
|
先留着 |
| 支持下。。。 |
| 谢谢楼主分享! |
| 总结的好……。 |
微信公众号
手机版