很多書籍都會(huì)把“”goto“”當(dāng)成反面教材使用,認(rèn)為如果使用不當(dāng),將會(huì)造成很多意想不到的問題。但goto作為C語(yǔ)言的一部分,存在即合理,goto有它的缺點(diǎn),也有它的優(yōu)點(diǎn)。 缺點(diǎn):
很容易把邏輯弄亂,增加理解難度,goto是可以實(shí)現(xiàn)無條件跳轉(zhuǎn)的,一旦跳轉(zhuǎn),就忽略很前面很多代碼,特別是在一些邏輯復(fù)雜的地方使用,會(huì)很容易出問題。所以goto能不用就不用,特別對(duì)于新手,盡量避諱。
優(yōu)點(diǎn):
方便處理異常情況,特別是內(nèi)存等系統(tǒng)資源的釋放。很多大型項(xiàng)目,開源項(xiàng)目,包括Linux內(nèi)核,都會(huì)使用goto來處理異常情況。 舉個(gè)例子,以下情況,大家第一反應(yīng)是沒有問題,其實(shí)是存在內(nèi)存泄漏隱患的。如果變量pdate2申請(qǐng)失敗,則退出函數(shù)。那么問題來了, pdate 申請(qǐng)成功了,但沒有得到釋放,出現(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實(shí)現(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)一的出錯(cuò)處理 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-
來源 | 二進(jìn)制人生
原文標(biāo)題:goto語(yǔ)句對(duì)與錯(cuò)
文章出處:【微信公眾號(hào):嵌入式ARM】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
責(zé)任編輯:haq
-
源代碼
+關(guān)注
關(guān)注
96文章
2946瀏覽量
66882
原文標(biāo)題:goto語(yǔ)句對(duì)與錯(cuò)
文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論