很多书籍都会把“”goto“”当成反面教材使用,认为如果使用不当,将会造成很多意想不到的问题。但goto作为C语言的一部分,存在即合理,goto有它的缺点,也有它的优点。缺点: k# I3 P" q4 G' j( x+ l1 E
很容易把逻辑弄乱,增加理解难度,goto是可以实现无条件跳转的,一旦跳转,就忽略很前面很多代码,特别是在一些逻辑复杂的地方使用,会很容易出问题。所以goto能不用就不用,特别对于新手,尽量避讳。
: {/ Y3 b8 ?1 [5 ]' b& e% _1 S优点:
" w2 b% \5 S. |3 u方便处理异常情况,特别是内存等系统资源的释放。很多大型项目,开源项目,包括Linux内核,都会使用goto来处理异常情况。举个例子,以下情况,大家第一反应是没有问题,其实是存在内存泄漏隐患的。如果变量pdate2申请失败,则退出函数。那么问题来了, pdate 申请成功了,但没有得到释放,出现了内存泄漏。所以这种情况如果使用goto,就很容易解决问题。- % q0 ^; C: c6 y! n* O* j7 B
- int module_init()8 _8 o4 ]8 Z( q# m& r
- {
$ x5 Y$ R6 {$ U- D! W; g - char *pdate = (char *)malloc(100);
. n+ W. j* b2 Y4 l4 f Y# a6 S- p0 ` - if(pdate == NULL)5 \0 {0 b4 X4 P1 ~4 u& J9 }
- return -1;
4 T7 W/ K/ @8 f5 R. F/ `" g+ d* p6 i - ' C8 W) H4 g- T- P& C: d
- char *pdate2 = (char *)malloc(100);
9 Y, J$ b# }6 ?, u4 G1 x - if(pdate2 == NULL): `) O+ X; h; S( O
- return -1;
: z z, C! l! l - 2 s& }( \. n* B% ?, _9 @& R% N
- free(pdate);
! A k0 f+ ~! E& H5 J* h( ~ - free(pdate2);
3 l( H' q _) A: k* d$ l - ......3 M2 y/ i- ~( Q- y2 G
- }
复制代码
9 v& `. ?! ~ t. O2 o& N! jgoto实现代码 - 6 t2 c) n( i% ^' }9 L
- int module_init()1 ^: Q8 Y1 p0 f$ o, l$ \$ t% w
- {
/ h* x; f- s. `+ b, } - char *pdate = (char *)malloc(100);
: \) l3 U _8 V - if(pdate == NULL)! | _8 [+ P0 g. |) s1 q" Z5 a
- goto err;
: L- F! s% c1 z: t
9 c0 a* s6 O2 J8 t- char *pdate2 = (char *)malloc(100);
' ^ k( h0 E+ _: G - if(pdate2 == NULL)
+ W3 _+ z: D$ P; J3 [, R - goto err;8 c$ ^8 j; M! f9 D1 k
- 8 Y5 u$ C/ }) Y/ Y$ |+ b
- free(pdate);
8 F7 ^# t' \+ \. |3 F9 s - free(pdate2);
4 X% c( u' B5 @* ` - ......
0 r1 s2 Z; n2 z$ Y1 w
& P+ i: ]0 J/ f7 |$ V2 B+ w6 g- err://统一的出错处理* v8 q* |8 {3 C1 ]1 `& i
- if(pdate != NULL)$ \; k5 h; x# Q: j
- free(pdate);
. w+ C ?. u4 |% }4 F. ^ - if(pdate2!= NULL)! u" E1 m7 n' {- C8 J) ?: F& B
- free(pdate2);% F3 J" [& g# ~5 j4 ~6 r& C
- return -1;$ u1 I5 `! {7 T2 i6 C% D" B& F, ]
- }
复制代码
Q$ |' }. n6 i3 D5 s" z
: C& [* v# G @+ d( A% v( E, y另一种写法就是分阶段处理:
3 x1 m0 n6 q( _( \6 G- 3 k$ d0 c& U% J. O8 g
- if(pdate == NULL)% r% e; P' z7 [, \/ h9 j
- goto err1;
! K7 B9 j# P: H* W+ l" Y7 v( `2 D) J - ...% N0 b' B$ T$ ?! S6 f' M
- if(pdate2 == NULL)5 q D8 ~- u u! M1 P9 S
- goto err2;. {; E$ E# F% x2 A/ U- Y! \
- ...
( |& Z( i4 L' |7 r - err1:; o* w" D: j( Y, B# Z. e, B1 p
- free(pdate);+ r! \$ L3 {( U2 E4 v& b
- err2:
( `% Z9 k3 M! ^" S - free(pdate2);
: |2 }$ C5 h+ j9 m3 W$ N. D' L - ...
复制代码
$ Y1 M6 o, B# X4 ^1 P3 A
总结:存在即合理,好坏取决于如何使用。
9 T3 H" F3 L$ c- _: w% S5 |6 S6 m3 M; }1 p/ F5 B5 b
|