程式設計好習慣 恰當使用goto語句

2022-09-16 21:51:21 字數 2707 閱讀 7296

**:

goto 語句在c/c++語言中可謂是「臭名昭著」,乃至有的書(或公司的程式設計規範)提出禁用goto語句的說法。其結果就是,造成有的程式設計師一看到goto語句 在某程式中被使用,就本能地認為這個程式寫得很「垃圾」。此外,也使得有些程式設計師因為使用了goto語句而覺得自己很不專業。其實,凡事都不能太偏 激,goto語句運用得好能大大地簡化程式,以及提高程式的可讀性和可維護性。在開始示例其好處之前,先用一些統計資料來說明goto語句並沒有因為「臭 名昭著」而被拋棄,這些統計資料可能並不是百分之百的精確,但很具有說服力。對於作業系統,linux-2.6.21核心使用了20,333個goto語 句,vxworks-6.2則使用了9142個,最後941個goto語句被運用到了rtems-4.9.2中;另外,glibc-2.9庫使用了 1750個goto語句。所有這些統計資料都表明,goto語言並沒有想象的那樣可怕而招到禁用,其關鍵在於 —— 恰當地運用它。

圖1是乙個沒有採用goto語句編寫的函式,其中存在多處出錯處理的**,比如113~115行、120~122行和126~129行。採用這種分布式的出錯處理,很容易出現遺漏釋放前面已經分配的資源,從而造成資源洩漏問題。如果採用goto語句,則能取得更好的效果。

example.c

00097: int queue_init (queue_t ** _pp_queue, int _size)

00098:

00106:     *_pp_queue = queue;

00107:

00108:     memset (queue, 0, sizeof (*queue));

00109:     queue->size_ = _size;

00110:

00111:     pthread_mutexattr_init (&attr);

00112:     if (0 != pthread_mutex_init(&queue->mutex_, &attr))

00117:

00118:     queue->messages_ = (void **) malloc (queue->size_ * sizeof (void *));

00119:     if (0 == queue->messages_)

00124:

00125:     if (0 != sem_init(&queue->sem_put_, 0, queue->size_))

00131:

00132:     pthread_mutexattr_destroy (&attr);

00133:

00134:     return 0;

00135: }

圖1圖2是採用goto語句所編寫的另乙個版本,與不採用goto語句的版本相比,程式更加的簡單,且在出錯處理的地方大都使用goto語句跳轉到程式的末尾進行處理。goto語句除了可以用在這裡所示例的出錯處理中,還可以用在其它的程式邏輯中以簡化程式並提高閱讀性。

example.c

00053: int queue_init (queue_t ** _pp_queue, int _size)

00054:

00062:     *_pp_queue = queue;

00063:

00064:     memset (queue, 0, sizeof (*queue));

00065:     queue->size_ = _size;

00066:

00067:     pthread_mutexattr_init (&attr);

00068:     if (0 != pthread_mutex_init(&queue->mutex_, &attr))

00071:

00072:     queue->messages_ = (void **) malloc (queue->size_ * sizeof (void *));

00073:     if (0 == queue->messages_)

00076:

00077:     if (0 != sem_init(&queue->sem_put_, 0, queue->size_))

00080:

00081:     pthread_mutexattr_destroy (&attr);

00082:

00083:     return 0;

00084:

00085: error1:

00086:     free (queue->messages_);

00087: error:

00088:     pthread_mutexattr_destroy (&attr);

00089:     free (queue);

00090:     return -1;

00091: }

圖2使用goto語句時需要注意以下原則:

1) 不要過份地使用。比如圖2中的60行就沒有採用goto語句跳到程式的最後面,之所以這裡不使用goto是為了閱讀方便。因為程式此時還沒有分配資源,所

以直接返回顯得更加的直接了當。還有就是,在這個函式中如果存在使用goto語句都意味著出錯了且需要釋放資源。如果將60行的語句也改為goto就破壞

了這個函式中使用goto語句的一致性。

2) 不要讓goto語句形成乙個環。使用goto語句應形成一條線,從一點跳到另一點。當然,如果goto語句的使用沒有破壞可讀性,那可以適當的考慮打破這一原則。

程式設計好習慣

我們在編碼的時候總是希望能寫出風格良好,清晰 健壯的程式,把 當成一件藝術品來看待 來雕琢,讓 coding成為一種藝術。看了很多大牛關於程式設計風格與修養方面的文章,很受啟發,結合自己體會,簡錄幾條,提醒自己時刻注意。1.引數檢查 對於有引數的函式,首先要對引數的合法性進行檢查。可以利用asser...

程式設計好習慣

1.dry 不要重複你自己 don t repeat yourself dry是一條最容易理解但又是相對比較難以應用的原則。它是指當你在兩處或者更多的地方發現相似 時,我們應當把它們抽象成乙個新的函式,在之前重複的地方呼叫新的函式並帶上適當的引數。dry也許是最普遍的一條程式設計原則,我從未發現乙個...

C 程式設計好習慣

1.不要在建構函式中做初始化操作 要求類 尤其是對外介面類 提供init 函式,在該函式中進行相關初始化操作,初始化失敗能夠返回錯誤碼。可以規避問題 建構函式中難以返回錯誤碼,外部呼叫者無從判斷初始化結果。當該類作為全域性變數使用時,構造函式呼叫發生在main 函式執行之前,出現問題難以追蹤。2.所...