Re: [問題] while(1)的新手疑問

看板C_and_CPP作者 (York)時間15年前 (2010/06/27 13:25), 編輯推噓4(4032)
留言36則, 5人參與, 最新討論串4/6 (看更多)
這種寫法可能有兩種用途: 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

06/27 13:28, , 1F
我只有上述兩種情況會這麼寫
06/27 13:28, 1F

06/27 13:28, , 2F
而且這兩種情況滿常發生的
06/27 13:28, 2F

06/27 13:58, , 3F
避免 goto 的場合下通常真正需要的是 return,除非是那種
06/27 13:58, 3F

06/27 13:58, , 4F
一個 function 塞好幾頁 code 的才真的需要 goto。
06/27 13:58, 4F

06/27 14:00, , 5F
換句話說,拆成小 function,就不必為了閃 goto
06/27 14:00, 5F

06/27 14:00, , 6F
而用 do while 開 block 來用 break 去做。
06/27 14:00, 6F

06/27 14:02, , 7F
上次戰這個是在 C99 之前了 當年 inline 沒標準化才有爭議
06/27 14:02, 7F

06/27 14:17, , 8F
我同意用拆成小 function 改用 return 的作法,我也有想到
06/27 14:17, 8F

06/27 14:18, , 9F
但是為了偷懶,還是會先用 do-while-break 必要時才改寫
06/27 14:18, 9F

06/27 14:20, , 10F
提到 C99 ,嗯敝公司的開發工具還沒跟上,唉
06/27 14:20, 10F

06/27 17:49, , 11F
一切的錯誤都是來自於偷懶啊 ~~~ XD
06/27 17:49, 11F

06/27 23:07, , 12F
我覺得goto還是有用的到的地方,像是執行到function的一
06/27 23:07, 12F

06/27 23:08, , 13F
半,之前malloc了一堆東西,現在出錯要收掉,直接goto到
06/27 23:08, 13F

06/27 23:08, , 14F
最後一次來收
06/27 23:08, 14F

06/27 23:09, , 15F
以前在學校也是聽到goto儘量不要用,可是現在不這麼認為
06/27 23:09, 15F

06/27 23:09, , 16F
了。學校和業界看到的東西還是有一些差距
06/27 23:09, 16F

06/27 23:49, , 17F
goto 本來就有用得到的地方,學校只有亂教的老師會全盤
06/27 23:49, 17F

06/27 23:49, , 18F
否認它的用處。但也確實存在不少誤會只能使用 goto 的場合
06/27 23:49, 18F

06/27 23:51, , 19F
。某些時候甚至我還會用比 goto 還恐怖的東西,
06/27 23:51, 19F

06/27 23:52, , 20F
就是 setjmp() 跟 longjmp()。不過這都是在學會 C++ 之前
06/27 23:52, 20F

06/27 23:52, , 21F
的事情了...
06/27 23:52, 21F

06/28 00:26, , 22F
(抖) 恐怖~~拜....<(_ _)> XD
06/28 00:26, 22F

06/28 00:26, , 23F
話說小弟公司也的確在driver會用goto跳到Error case做
06/28 00:26, 23F

06/28 00:27, , 24F
資源回收說, 想想要漂亮的處理起來好像真不太容易Orz
06/28 00:27, 24F

06/28 01:27, , 25F
那不考慮直接用 pool 嗎?不然配置資源順序是 A -> B -> C
06/28 01:27, 25F

06/28 01:27, , 26F
,配完 B 出錯只能釋放 A B,配完 C 才出錯才能釋放 A B C
06/28 01:27, 26F

06/28 01:28, , 27F
。煩都煩死了,整個 pool 丟掉最快。
06/28 01:28, 27F

06/28 01:29, , 28F
而且應該大部分的編譯器還有支援 alloca,如果配置的資源
06/28 01:29, 28F

06/28 01:29, , 29F
確定在 function return 後就會釋放,可以用這個。
06/28 01:29, 29F

06/28 01:31, , 30F
解決類似問題的工具還有 GNU libiberty 的 obstack。
06/28 01:31, 30F

06/28 01:32, , 31F

06/28 01:36, , 32F
確實小弟在driver看到過正如t大舉的例子一般, 按順序來,
06/28 01:36, 32F

06/28 01:37, , 33F
錯了還要goto走, 一個一個檢查誰要free這種瑣碎事...Orz
06/28 01:37, 33F

06/28 01:38, , 34F
不過也有部份的code疑似有自己的管理pool, 說疑似是因為
06/28 01:38, 34F

06/28 01:40, , 35F
被包裝好了, 平常根本不會trace到XD 或許真的該額外抽些
06/28 01:40, 35F

06/28 01:41, , 36F
時間自己研究精進寫程式的技術或其他工具方法說....Q_Q~
06/28 01:41, 36F
文章代碼(AID): #1C9k3S8X (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1C9k3S8X (C_and_CPP)