[問題] 請問assert之後要不要return?

看板C_and_CPP作者 (小毛哥)時間10年前 (2013/11/18 13:03), 編輯推噓2(208)
留言10則, 5人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VS2008, C++ 問題(Question): 想請教這兩種寫法: 1. void func(some* ptr) { assert(ptr); ptr->do(); } 2. void func(some* ptr) { if (ptr == NULL) { assert(0); return; } ptr->do(); } 哪種較好? 個人比較喜歡1, 因為簡單明確也沒有無用的code. 在debug build的時候遇到ptr為NULL可以找出問題. 可是, 在release build的時候, assert直接變成noop, 雖然理論上release build的時候程式應該已經通過檢驗, 不應該發生ptr == NULL, 假使真的還是發生了, 那就當了. 所以若採用第2種做法就是debug, release通吃, 但code量會增加很多, 而且萬一ptr真的永遠不為NULL, 那這些code都白做工了. 聽起來滿矛盾的, 所以想請教比較好的做法是否要加強程式測試的完整性, 以及盡量多使用reference就可以免除NULL pointer check? 在測試完整的狀況下是否可以採用1的做法? 或者不論測試完整與否都應該採用某種作法較佳? 諸多疑惑望請板友開示 謝謝Orz -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.133.45.115

11/18 13:07, , 1F
若是C++的話,我比較傾向傳入reference,
11/18 13:07, 1F

11/18 13:08, , 2F
null pointer check的責任交給client
11/18 13:08, 2F

11/18 13:09, , 3F
否則傳pointer, client到底要不要check還要看函式有沒有check
11/18 13:09, 3F

11/18 13:09, , 4F
會失去函式的封裝性
11/18 13:09, 4F

11/18 13:56, , 5F
assert的用意就是release不檢查
11/18 13:56, 5F

11/18 13:56, , 6F
兩種都要檢查你應該寫另一個函數
11/18 13:56, 6F

11/18 14:09, , 7F
認同樓上~(說好的 exception 呢)
11/18 14:09, 7F

11/18 14:35, , 8F
不要用2,如果ptr真的變null,那寧可讓它當掉
11/18 14:35, 8F

11/18 14:36, , 9F
直接return錯誤還是存在(因為少做事),而且更難查覺
11/18 14:36, 9F

11/18 21:53, , 10F
謝謝小善大的指教 相當中肯!
11/18 21:53, 10F
文章代碼(AID): #1IYP-vzb (C_and_CPP)