看板 C_and_CPP 關於我們 聯絡資訊
這種寫法可能有兩種用途: 1. 強調這個 macro 是 statement ,後面一定要加分號,否則會有 warning #define statement1() do {xxx} while(0) 2. 用於例外處理,可以避免 goto do { buf = malloc(n); if (buf == NULL) break; ... } while (0); ※ 引述《sceneryview (加油~~~)》之銘言: : 藉由這一篇來請問一個相關的問題 : 在linux kernel的程式中,有時後會見到以下的寫法 : do : { : code... : }while(0); : 從字面上來看,就是只作一次 : 感覺就沒必要加do {}while(0)了 : 有人知道這種寫法的特殊用意嗎?? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.59.19.214
ykjiang:我只有上述兩種情況會這麼寫 06/27 13:28
ykjiang:而且這兩種情況滿常發生的 06/27 13:28
tinlans:避免 goto 的場合下通常真正需要的是 return,除非是那種 06/27 13:58
tinlans:一個 function 塞好幾頁 code 的才真的需要 goto。 06/27 13:58
tinlans:換句話說,拆成小 function,就不必為了閃 goto 06/27 14:00
tinlans:而用 do while 開 block 來用 break 去做。 06/27 14:00
tinlans:上次戰這個是在 C99 之前了 當年 inline 沒標準化才有爭議 06/27 14:02
ykjiang:我同意用拆成小 function 改用 return 的作法,我也有想到 06/27 14:17
ykjiang:但是為了偷懶,還是會先用 do-while-break 必要時才改寫 06/27 14:18
ykjiang:提到 C99 ,嗯敝公司的開發工具還沒跟上,唉 06/27 14:20
ledia:一切的錯誤都是來自於偷懶啊 ~~~ XD 06/27 17:49
cobrasgo:我覺得goto還是有用的到的地方,像是執行到function的一 06/27 23:07
cobrasgo:半,之前malloc了一堆東西,現在出錯要收掉,直接goto到 06/27 23:08
cobrasgo:最後一次來收 06/27 23:08
cobrasgo:以前在學校也是聽到goto儘量不要用,可是現在不這麼認為 06/27 23:09
cobrasgo:了。學校和業界看到的東西還是有一些差距 06/27 23:09
tinlans:goto 本來就有用得到的地方,學校只有亂教的老師會全盤 06/27 23:49
tinlans:否認它的用處。但也確實存在不少誤會只能使用 goto 的場合 06/27 23:49
tinlans:。某些時候甚至我還會用比 goto 還恐怖的東西, 06/27 23:51
tinlans:就是 setjmp() 跟 longjmp()。不過這都是在學會 C++ 之前 06/27 23:52
tinlans:的事情了... 06/27 23:52
VictorTom:(抖) 恐怖~~拜....<(_ _)> XD 06/28 00:26
VictorTom:話說小弟公司也的確在driver會用goto跳到Error case做 06/28 00:26
VictorTom:資源回收說, 想想要漂亮的處理起來好像真不太容易Orz 06/28 00:27
tinlans:那不考慮直接用 pool 嗎?不然配置資源順序是 A -> B -> C 06/28 01:27
tinlans:,配完 B 出錯只能釋放 A B,配完 C 才出錯才能釋放 A B C 06/28 01:27
tinlans:。煩都煩死了,整個 pool 丟掉最快。 06/28 01:28
tinlans:而且應該大部分的編譯器還有支援 alloca,如果配置的資源 06/28 01:29
tinlans:確定在 function return 後就會釋放,可以用這個。 06/28 01:29
tinlans:解決類似問題的工具還有 GNU libiberty 的 obstack。 06/28 01:31
tinlans:http://tinyurl.com/2edj33m 06/28 01:32
VictorTom:確實小弟在driver看到過正如t大舉的例子一般, 按順序來, 06/28 01:36
VictorTom:錯了還要goto走, 一個一個檢查誰要free這種瑣碎事...Orz 06/28 01:37
VictorTom:不過也有部份的code疑似有自己的管理pool, 說疑似是因為 06/28 01:38
VictorTom:被包裝好了, 平常根本不會trace到XD 或許真的該額外抽些 06/28 01:40
VictorTom:時間自己研究精進寫程式的技術或其他工具方法說....Q_Q~ 06/28 01:41