很多書籍都會把“”goto“”當(dāng)成反面教材使用,認(rèn)為如果使用不當(dāng),將會造成很多意想不到的問題。但goto作為C語言的一部分,存在即合理,goto有它的缺點,也有它的優(yōu)點。 缺點:
很容易把邏輯弄亂,增加理解難度,goto是可以實現(xiàn)無條件跳轉(zhuǎn)的,一旦跳轉(zhuǎn),就忽略很前面很多代碼,特別是在一些邏輯復(fù)雜的地方使用,會很容易出問題。所以goto能不用就不用,特別對于新手,盡量避諱。
優(yōu)點:
方便處理異常情況,特別是內(nèi)存等系統(tǒng)資源的釋放。很多大型項目,開源項目,包括Linux內(nèi)核,都會使用goto來處理異常情況。 舉個例子,以下情況,大家第一反應(yīng)是沒有問題,其實是存在內(nèi)存泄漏隱患的。如果變量pdate2申請失敗,則退出函數(shù)。那么問題來了, pdate 申請成功了,但沒有得到釋放,出現(xiàn)了內(nèi)存泄漏。所以這種情況如果使用goto,就很容易解決問題。
int module_init(){ char *pdate = (char *)malloc(100); if(pdate == NULL) return -1; char *pdate2 = (char *)malloc(100); if(pdate2 == NULL) return -1; free(pdate); free(pdate2); ......}
goto實現(xiàn)代碼
int module_init(){ char *pdate = (char *)malloc(100); if(pdate == NULL) goto err; char *pdate2 = (char *)malloc(100); if(pdate2 == NULL) goto err; free(pdate); free(pdate2); ...... err://統(tǒng)一的出錯處理 if(pdate != NULL) free(pdate); if(pdate2!= NULL) free(pdate2);return-1;}另一種寫法就是分階段處理:
if(pdate == NULL)gotoerr1;...if(pdate2==NULL) goto err2; ...err1: free(pdate);err2: free(pdate2);...
總結(jié):存在即合理,好壞取決于如何使用。
-END-
來源 | 二進制人生
原文標(biāo)題:goto語句對與錯
文章出處:【微信公眾號:嵌入式ARM】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
責(zé)任編輯:haq
-
源代碼
+關(guān)注
關(guān)注
96文章
2946瀏覽量
66831
原文標(biāo)題:goto語句對與錯
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論