[問題] 程式寫法

看板C_and_CPP作者 (涼雨)時間15年前 (2010/03/09 23:43), 編輯推噓12(12043)
留言55則, 12人參與, 最新討論串1/1
我在看之前前輩留下來的code 發現有一個寫法,幾乎大部分的函式都這樣寫 while(1) { if() //這個寫法其實判斷都會成立 break; } 或是 while(1) { XXX break; } 發現後者甚至沒有判斷就會break,程式碼只會執行一次,所以迴圈沒有意義 前輩喜歡在函式弄個while這樣處理 我不太了解為什麼要這麼做 想請教有人知道這樣做的好處是什麼嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 125.230.4.197

03/09 23:47, , 1F
XXX的地方有continue嗎?
03/09 23:47, 1F

03/09 23:49, , 2F
沒有,xxx就是函式應該要做的事情,只是被挪到while裡面
03/09 23:49, 2F

03/09 23:49, , 3F
線索也太少了吧
03/09 23:49, 3F

03/09 23:50, , 4F
其實就是把函式放到while,然後無條件break,所以我也不
03/09 23:50, 4F

03/09 23:50, , 5F
懂為什麼這樣做
03/09 23:50, 5F

03/09 23:51, , 6F
我猜是測試用的
03/09 23:51, 6F

03/09 23:52, , 7F
他可能腦殼有洞...
03/09 23:52, 7F

03/10 00:10, , 8F
#define M_foo() do{/*...*/}while(0); //包macro之用?
03/10 00:10, 8F

03/10 00:17, , 9F
小弟的主管也提過像上面這樣子包macro的方式, 不過沒有
03/10 00:17, 9F

03/10 00:17, , 10F
while(0)後面的';', 據說這樣寫是讓macro用起來像寫正常
03/10 00:17, 10F

03/10 00:18, , 11F
程式(像func call?)的寫法, 反正compiler optimize會把
03/10 00:18, 11F

03/10 00:18, , 12F
多餘的code去掉@_@"
03/10 00:18, 12F

03/10 00:21, , 13F
奇怪?我家的codebase也沒有這種寫法... 我去哪學的...
03/10 00:21, 13F

03/10 00:59, , 14F
好處是到時候要阻斷這段程式碼只要改一個數字?
03/10 00:59, 14F

03/10 01:19, , 15F
#ifdef TRACE_ON
03/10 01:19, 15F

03/10 01:19, , 16F
#define TRACE_STR(X) do{printf("%s",X)}while(0);
03/10 01:19, 16F

03/10 01:19, , 17F
#else
03/10 01:19, 17F

03/10 01:20, , 18F
#define TRACE_STR(X) {}
03/10 01:20, 18F

03/10 01:20, , 19F
#endif //大概這樣吧
03/10 01:20, 19F

03/10 01:58, , 20F
03/10 01:58, 20F

03/10 02:22, , 21F
do{}while(0) 我也忘了再哪學到的 =_=
03/10 02:22, 21F

03/10 02:22, , 22F
只記得linux kernel primer有提這種範例
03/10 02:22, 22F

03/10 08:37, , 23F
do{}while(0) 不是只是為了讓 {} 後面不要有落單的 ; 嗎?
03/10 08:37, 23F

03/10 08:37, , 24F
(因為有些舊的 compiler 不吃這套)
03/10 08:37, 24F

03/10 10:20, , 25F
好奇怪喔,這跟直接寫#define TRACE_STR(X) printf("%s",X
03/10 10:20, 25F

03/10 10:21, , 26F
) 有什麼差異嗎
03/10 10:21, 26F

03/10 11:04, , 27F
一條比較沒差, 但macro後面有多條的時候就需要{}了:)
03/10 11:04, 27F

03/10 11:04, , 28F
另外這應該跟debug時改數字沒關係, 因為根本沒有開關讓
03/10 11:04, 28F

03/10 11:05, , 29F
它改, 而且define macro展開也不容易break到吧@_@"
03/10 11:05, 29F

03/10 11:22, , 30F
呵, 謝v大, 但多行時不就一直 "\"下去~ 或許{}是有scope
03/10 11:22, 30F

03/10 11:23, , 31F
的觀念在裡面吧? ^^"
03/10 11:23, 31F

03/10 11:36, , 32F
小弟我也猜是這樣, 用'\'接是ok, 但是用{}寫就有偽裝/強
03/10 11:36, 32F

03/10 11:36, , 33F
制inline的fu在裡面, 所以也可能有宣告變數在macro內;
03/10 11:36, 33F

03/10 11:37, , 34F
當然, 以現今的programing, 也許用inline就好:)
03/10 11:37, 34F

03/10 12:30, , 35F
我問到他了,他是為了避免太多return 和 if
03/10 12:30, 35F

03/10 12:31, , 36F
還有可以在while後面檢查new的空間是否有被release
03/10 12:31, 36F

03/10 12:49, , 37F
那為什麼不直接寫個block?
03/10 12:49, 37F

03/10 13:00, , 38F
他讓new的指標宣告在外面,方便管理
03/10 13:00, 38F

03/10 15:31, , 39F
避免太多 return 和 if?!.. 還在 while 後檢查有沒有
03/10 15:31, 39F

03/10 15:31, , 40F
release?! 有人明白那是什麼鬼意思嗎? @.@
03/10 15:31, 40F

03/10 15:44, , 41F
推測是memory會在func block頭alloc好, 但是程式中間可
03/10 15:44, 41F

03/10 15:45, , 42F
能有幾個step處理都可能偵測到錯誤要離開func, 這時候在
03/10 15:45, 42F

03/10 15:45, , 43F
func裡插一堆return會讓code比較醜, 還要處理未使用或使
03/10 15:45, 43F

03/10 15:46, , 44F
用到一半alloc來的memory. 這裡用break或許會比用一堆的
03/10 15:46, 44F

03/10 15:46, , 45F
clean與return, 然後在while結束後統一做memory的free,
03/10 15:46, 45F

03/10 15:47, , 46F
或許會比較乾淨?? ma~~我們家在這種狀況裡是直接goto下
03/10 15:47, 46F

03/10 15:47, , 47F
去了; 而且它這招在迴圈或switch裡就會失靈的感覺@_@"
03/10 15:47, 47F

03/10 20:11, , 48F
避免太多 return 和if ....?檢查release ? 別聽他喇叭了
03/10 20:11, 48F

03/10 20:11, , 49F
亂寫就是亂寫
03/10 20:11, 49F

03/10 20:12, , 50F
有這樣的需求的時候 應該要開始考慮是不是該抽出成func了
03/10 20:12, 50F

03/10 23:43, , 51F
f大那篇連結寫的不錯阿.
03/10 23:43, 51F

03/10 23:43, , 52F
用在 macro 時的確很有道理
03/10 23:43, 52F

03/11 01:06, , 53F
的確, 不過現在來說似乎用inline比較簡單; 不過macro的
03/11 01:06, 53F

03/11 01:06, , 54F
寫法是強制inline就是了, 不過這是do{}while(0)的case;
03/11 01:06, 54F

03/11 01:07, , 55F
原po那個寫法就........orz
03/11 01:07, 55F
文章代碼(AID): #1Bbcot4L (C_and_CPP)