
Keil编译常见问题(一) warning: #1295-D: warning: #1295-D: Deprecated declaration ShowSendTime - give arg types9 \- s" X/ }6 Y _* W# Q. G0 L# L 解决方法:将void ShowSendTime()改为void ShowSendTime(void) / T2 q+ u- K& |( C. `0 q4 X( z0 z8 M warning: #550-D:warning: #550-D: variable "d" was set but never used 描述:变量'd'定义但从未使用,或者是,虽然这个变量你使用了,但编译器认为变量d所在的语句没有意义,编译器把它优化了.( I3 H8 a4 { \7 s 解决:仔细衡量所定义的变量d是否有用,若是认定变量d所在语句有意义,那么尝试用volatile关键字修饰变量d,若是真的没有用,那么删除掉以释放可能的内存. error: #159:你的固件库里的库文件没有添加进工程里面,所以出现未定义的情况。6 W% a6 z) W: |+ }: f TIM2_IRQChannel指定时器2的中断通道没有定义,其实在固件库对这些参数都有定义,宏定义代替了一串寄存器地址数据。需要将.C文件添加到工程文件中解决方法:在函数a调用函数b之前,对函数b进行声明,如:; {2 b' _7 Y/ A- _ void b(void); //对函数b进行声明 void a(void) //函数a的实体 { b(); //调用函数b0 Q! I! P- r1 [$ ] }1 Y1 S- Y+ Q5 g void b(void) //函数b的实体 {& A, @8 n0 n* i ...( c0 ~" u" m% q% n/ y2 Q* G5 u, t1 Z& l }- \8 A5 s, ]. O V) ~% E6 `' X/ H error: #70:error: #70: incomplete type is not allowed 你的固件库里的库文件没有添加进工程里面,所以出现未定义的情况。4 h; t. R' M! x _# O5 f! P0 M; A7 Y& E* e TIM2_IRQChannel指定时器2的中断通道没有定义,其实在固件库对这些参数都有定义,宏定义代替了一串寄存器地址数据。需要将.C文件添加到工程文件中 1 I( C4 L( K/ } 8 J/ ?9 [; N0 |- X0 g warning: #550-D:1.warning: #550-D: variable "d" was set but never used( E- [3 f. z: X" ?% i6 S( _ 描述:变量'd'定义但从未使用,或者是,虽然这个变量你使用了,但编译器认为变量d所在的语句没有意义,编译器把它优化了. 解决:仔细衡量所定义的变量d是否有用,若是认定变量d所在语句有意义,那么尝试用volatile关键字修饰变量d,若是真的没有用,那么删除掉以释放可能的内存.3 t: `6 Q8 y y4 F3 m9 d1 r " P' o3 t T. P( Z1 Y" ] warning: #1-D:2.warning: #1-D: last line of file ends without a newline 描述:文件最后一行不是新的一行.编译器要求程序文件的最后一行必须是空行,想了半天没想通为什么要这样. 解决:可以不理会.若是觉得出现警告不爽,那么在出现警告的文件的最后一行敲个回车,空出一行.8 _* K- r" L2 ^ warning: #111-D:3. warning: #111-D: statement is unreachable: V8 Y0 W" l3 ]+ v 描述:声明不可能到达.多出现在这种场合: int main(void)& j: Z X4 }8 @3 q! {1 s {3 M1 U( A, \* y ... 1 O! x, w( y0 A# a, y while(1) //无限循环,这在不使用操作系统的程序中最常见 { ...5 }4 y: l$ f! S ! }8 G0 _+ } R6 h5 {) W: d) P } f3 ]3 H- q7 G7 ~4 ^# t w2 ? % m7 J' z0 Z2 R" x( s) G. M1 E9 x4 k return 0; //这句声明在正常情况下不可能执行到,编译器发出警告 }, f0 w$ g9 T2 x9 F 解决:不理会. ; X* v, X6 e$ `" w warning: C3017W:4. warning: C3017W: data may be used before being set9 Y/ B: z: w2 e 描述:变量'data'在使用前没有明确的赋值.如: uint8 i,data; //定义变量i和data,二者都没有明确赋值; A' i# H+ @( ?: d4 i ; Z/ @# u6 ^; T) g& p for ( i = 0; i < 8; i++) //变量'i'在语句中被赋值0) k7 I" j) O+ L/ x+ j {0 U( s9 A- y. b1 z8 e/ g4 v2 m if ( IO1PIN & SO_CC2420 ) f" N1 j2 u7 O" X7 g data |= 0x01; //变量'data'在使用前没有明确赋值,编译器发出警告* b' B+ c0 u3 ^) i( a else data &= ~0x01; }; u- {: c& C/ V4 n 解决:应仔细衡量该变量的初始值是否为0,若是,可以不理会这个警告,因为MDK编译器在程序执行前,会将使用到的数据区初始化为0,但若是该变量的初始值不应该是0,忽略这个警告可能会引起致命错误.这个警告应引起足够重视.应养成变量赋初值的习惯,好在有编译器给把关.: f. z2 O, \' H. O6 R warning: #177-D:5. warning: #177-D: variable "temp" was declared but never referenced3 U R+ s6 ~1 ]0 t& P" |% y 描述:变量'temp'进行了声明但没有引用.多出现在声明了一个变量,但却没有使用它,它和warning: #550-D: variable "temp" was set but never used不同之处在于temp从没有使用过. 解决:若是定义的变量确实没有用,删除掉;若是有用,则在程序中使用.0 ?# K7 p3 |; x, n; W/ Y 与该警告类似的还有 warning: #177-D: function "MACProcessBeacon" was declared but never referenced5 @- p( z) V8 Y9 n! F % C' a! I$ R$ E8 K B/ a/ j/ y( O warning: #940-D:6. warning: #940-D: missing return statement at end of non-void function "DealwithInspect2"5 D! O' k+ J: C$ m) L6 m 描述:返回非空的函数"DealwithInspect2"的最后缺少返回值声明.如: int DealwithInspect2(uint32 test)' |3 D! u5 T5 r* }- S+ g) H+ g6 X* w {7 a$ o4 u* M. J* } ... ... ...$ U9 F. w- u4 e' a //此处应该是return x;返回一个int型数据,若是没有返回值,编译器产生警告 }% b) `" A0 W+ [" G .warning: #1295-D:7..warning: #1295-D: Deprecated declaration lcd_init - give arg types' p6 c4 }2 ] {3 `. L: Q( c 描述:在定义函数的时候,如果你写上函数参数,就会有这个警告,比如void timer_init(); 这里就没有形参,如果这样的话,编译器会给出警告. error: #65:1. error: #65: expected a ";" 描述:缺少分号.大多是漏忘';'." t* x0 ]& L5 b7 w6 g0 T; w" h2 O 解决:双击错误行,在定位到错误点的附近找到没加';'号的语句,加上分号.并不一定在定位到的错误行才却分号,可能是这行的上一行,也可能是下一行. error: #65: error: #202. error: #65: expected a ";"和 error: #20: identifier "xxxx" is undefined一块出现,而且后面的error: #20错误可能一大堆* c7 @5 V. S8 z 描述:这个错误对于第一次遇上的人来说绝对是个噩梦,当错误出现,满怀希望的双击错误提示,来到错误行时却愕然发现,错误行绝对没有错,于是找找错误行的上一行,下一行,没有错误,再找上上行,下下行...让人无比郁闷的事情出现了:编译提示的所有错误行都不可能有错误出现.其实这最可能是你在.h文件声明外部变量或者函数时,没有在声明语句的最后加分号!如果你有很多模块,如main.c,lcd.c,key.c...有很多头文件,如lcd.h,key.h,若是在lcd.h文件声明函数时没有加分号,那么这种错误可能定为到main.c中,所以要检查所有头文件.1 i: W- ~, d" }6 B: ~- m' D( a3 w+ J; l 解决:仔细检查.h文件,将分号补上. ! ^" ~. r6 m/ g( x5 e Error: L6200E:3. Error: L6200E: Symbol flagu multiply defined (by uart0.o and main.o). 描述:变量(也是一种符号)flagu多处定义(在uart0.c中和main.c都定义了).通常错在全局变量定义重复.比如:在main.c中定义全局变量flagu:5 U* i& C( \' K7 u u' K4 L2 p ; M/ b$ f/ i# t1 i+ ] X uint8 flagu=0; 在uart0.c中也用到该变量,于是声明此变量,我通常都是先复制定义的变量再在变量前面加关键字extern修饰: + y+ W; ?/ ~4 i; k' n8 D7 V" J extern uint8 flagu=0; 4 T# N2 C2 _: C3 `; m* k 然后编译,就会出现上面的连接错误,原因在于,我在uart0.c中是又定义了一个变量,而不是声明变量,因为我给变量赋了初值"flagu=0",这样就重复定义了变量flag.正确的声明方法是去掉赋值部分: . S; W8 |2 G3 n+ U extern uint8 flagu; 解决办法:找到重复定义的变量,看情况修改一处.9 S9 B+ A6 g% u : S' f8 C @7 `; |, B: i- b, [2 ] error: #159:4.error: #159: declaration is incompatible with previous "wr_lcd" (declared at line 40)% c' u" l; y3 `& ?% M 描述:在wr_lcd函数还没有声明之前就已经使用了.多出现在两种情况:第一种,wr_lcd函数体还没有写,就已经用到了它,这种情况多出现在写一个程序的大体结构中,只是简单写一下框架.第二种情况比较常见,函数a调用函数b,但函数b的函数体在函数a的下面: void a(void) //函数a的实体. z4 o+ J8 h0 j {2 l# j8 C0 X2 t$ A, |, G4 o b(); //调用函数b } # I+ Y+ h: }( {3 F" F' O; ` void b(void) //函数b的实体 { ..., x1 x" F" g% h% h& ] }0 Q5 N, R4 L, a6 U- H% r$ A' { h5 R 这样如果点编译,就会产生error: #159的错误,因为当函数a调用函数b时,发现在这之前都没有函数b的任何声明. 解决方法:在函数a调用函数b之前,对函数b进行声明,如:: H/ K$ o3 q! o* l void b(void); //对函数b进行声明8 t% Z8 Z9 u+ \% ~ + _# H: N! h0 Z; P$ h# G void a(void) //函数a的实体: X# p: D/ q( ?! i) |$ B" J. a3 ` {, q/ I$ `9 k2 w4 T9 d" z1 a0 o b(); //调用函数b }# ~1 H9 i C$ Y& K1 s void b(void) //函数b的实体 {' s: r) }4 t. ] ...) N' O# N( V7 }! Q' X/ n" s+ Q# v } ^- a2 w, x y! ?% P error: #137:5. error: #137: expression must be a modifiable lvalue$ [4 k/ a$ L: }5 J 8 I- b1 y$ J+ G- V 描述:表达式必须是一个可以修改的左值.主要出现在这种现象:. U# x: x' [ D7 ?; Y) ~1 [1 p& \ _! ]4 F/ t9 M t a=NUM; % P5 ~( O- I3 J8 I$ U% u2 P4 C NUM是一个数值或表达式,a为一个变量,但a被定义为像const这种不可更改的类型,导致NUM不能赋值给变量a. 解决方法:要么放弃赋值,要么修改变量属性.* `" u8 H5 p) e' B 8 [5 o2 W3 r. v! ?- C* O- c! M* m( \2 ^ error: #1113: 你的固件库里的库文件没有添加进工程里面,所以出现未定义的情况。 TIM2_IRQChannel指定时器2的中断通道没有定义,其实在固件库对这些参数都有定义,宏定义代替了一串寄存器地址数据。需要将.C文件添加到工程文件中__asm放到一个单独的子函数再被调用就没问题了6 \4 A O" |8 p- R9 ^ 如下: __asm void nop(void)6 p* ~6 J! x5 [# T4 b- N% g* L {; n6 o* K6 L% H" J NOP( L/ \ v- @( C* J# g$ j$ n } 然后在之后的C代码中调用该函数:. h( }" S# C' R! @# G8 X% z) D void main() { ... nop();# d6 ?% L* {( p+ d ... 0 `* p, ?# d. M7 x2 e) x } ; k1 A% a2 a. E. p* R/ T5 C* ^ |
不错不错,支持下 |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
两个都是楼主发的啊 |
很不错的 |
![]() ![]() ![]() ![]() ![]() ![]() |
我是来学习的。 |
先留着9 B' G+ t, Q* x |
支持下。。。 |
谢谢楼主分享! |
总结的好……。 |