看板 C_and_CPP 關於我們 聯絡資訊
我在看之前前輩留下來的code 發現有一個寫法,幾乎大部分的函式都這樣寫 while(1) { if() //這個寫法其實判斷都會成立 break; } 或是 while(1) { XXX break; } 發現後者甚至沒有判斷就會break,程式碼只會執行一次,所以迴圈沒有意義 前輩喜歡在函式弄個while這樣處理 我不太了解為什麼要這麼做 想請教有人知道這樣做的好處是什麼嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 125.230.4.197
dendrobium:XXX的地方有continue嗎? 03/09 23:47
clarkman:沒有,xxx就是函式應該要做的事情,只是被挪到while裡面 03/09 23:49
clanguage:線索也太少了吧 03/09 23:49
clarkman:其實就是把函式放到while,然後無條件break,所以我也不 03/09 23:50
clarkman:懂為什麼這樣做 03/09 23:50
clanguage:我猜是測試用的 03/09 23:51
yoco315:他可能腦殼有洞... 03/09 23:52
softwind:#define M_foo() do{/*...*/}while(0); //包macro之用? 03/10 00:10
VictorTom:小弟的主管也提過像上面這樣子包macro的方式, 不過沒有 03/10 00:17
VictorTom:while(0)後面的';', 據說這樣寫是讓macro用起來像寫正常 03/10 00:17
VictorTom:程式(像func call?)的寫法, 反正compiler optimize會把 03/10 00:18
VictorTom:多餘的code去掉@_@" 03/10 00:18
softwind:奇怪?我家的codebase也沒有這種寫法... 我去哪學的... 03/10 00:21
bill42362:好處是到時候要阻斷這段程式碼只要改一個數字? 03/10 00:59
softwind:#ifdef TRACE_ON 03/10 01:19
softwind:#define TRACE_STR(X) do{printf("%s",X)}while(0); 03/10 01:19
softwind:#else 03/10 01:19
softwind:#define TRACE_STR(X) {} 03/10 01:20
softwind:#endif //大概這樣吧 03/10 01:20
fragileness:這個嗎 http://mkseo.pe.kr/blog/?p=28 03/10 01:58
sunneo:do{}while(0) 我也忘了再哪學到的 =_= 03/10 02:22
sunneo:只記得linux kernel primer有提這種範例 03/10 02:22
LPH66:do{}while(0) 不是只是為了讓 {} 後面不要有落單的 ; 嗎? 03/10 08:37
LPH66:(因為有些舊的 compiler 不吃這套) 03/10 08:37
flashphp:好奇怪喔,這跟直接寫#define TRACE_STR(X) printf("%s",X 03/10 10:20
flashphp:) 有什麼差異嗎 03/10 10:21
VictorTom:一條比較沒差, 但macro後面有多條的時候就需要{}了:) 03/10 11:04
VictorTom:另外這應該跟debug時改數字沒關係, 因為根本沒有開關讓 03/10 11:04
VictorTom:它改, 而且define macro展開也不容易break到吧@_@" 03/10 11:05
flashphp:呵, 謝v大, 但多行時不就一直 "\"下去~ 或許{}是有scope 03/10 11:22
flashphp:的觀念在裡面吧? ^^" 03/10 11:23
VictorTom:小弟我也猜是這樣, 用'\'接是ok, 但是用{}寫就有偽裝/強 03/10 11:36
VictorTom:制inline的fu在裡面, 所以也可能有宣告變數在macro內; 03/10 11:36
VictorTom:當然, 以現今的programing, 也許用inline就好:) 03/10 11:37
clarkman:我問到他了,他是為了避免太多return 和 if 03/10 12:30
clarkman:還有可以在while後面檢查new的空間是否有被release 03/10 12:31
dendrobium:那為什麼不直接寫個block? 03/10 12:49
clarkman:他讓new的指標宣告在外面,方便管理 03/10 13:00
adrianshum:避免太多 return 和 if?!.. 還在 while 後檢查有沒有 03/10 15:31
adrianshum:release?! 有人明白那是什麼鬼意思嗎? @.@ 03/10 15:31
VictorTom:推測是memory會在func block頭alloc好, 但是程式中間可 03/10 15:44
VictorTom:能有幾個step處理都可能偵測到錯誤要離開func, 這時候在 03/10 15:45
VictorTom:func裡插一堆return會讓code比較醜, 還要處理未使用或使 03/10 15:45
VictorTom:用到一半alloc來的memory. 這裡用break或許會比用一堆的 03/10 15:46
VictorTom:clean與return, 然後在while結束後統一做memory的free, 03/10 15:46
VictorTom:或許會比較乾淨?? ma~~我們家在這種狀況裡是直接goto下 03/10 15:47
VictorTom:去了; 而且它這招在迴圈或switch裡就會失靈的感覺@_@" 03/10 15:47
sunneo:避免太多 return 和if ....?檢查release ? 別聽他喇叭了 03/10 20:11
sunneo:亂寫就是亂寫 03/10 20:11
sunneo:有這樣的需求的時候 應該要開始考慮是不是該抽出成func了 03/10 20:12
clanguage:f大那篇連結寫的不錯阿. 03/10 23:43
clanguage:用在 macro 時的確很有道理 03/10 23:43
VictorTom:的確, 不過現在來說似乎用inline比較簡單; 不過macro的 03/11 01:06
VictorTom:寫法是強制inline就是了, 不過這是do{}while(0)的case; 03/11 01:06
VictorTom:原po那個寫法就........orz 03/11 01:07