看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《swhaaaaa (路人甲)》之銘言: : → LPH66:倒不是什麼東西不能使用多行 macro 08/16 15:26 : → LPH66:你得要知道 macro 對你的程式做了什麼事 08/16 15:26 : → LPH66:macro 會直接把內容給代換進使用處 08/16 15:27 : → LPH66:所以你要看代換之後程式還能不能用 08/16 15:28 : → LPH66:而且 macro 的寫法也是要看用法而定的 08/16 15:29 : → swhaaaaa:那以if的condition來看,如果我要用macro做多個運算後再 08/16 16:16 : → swhaaaaa:做判斷這樣辦的到嗎? 08/16 16:16 : → swhaaaaa:那以這個case要用do while(0)預防錯誤是否可行 08/16 16:17 : → swhaaaaa:我這個問題其實只是想試看看用macro來做,不然其使用 08/16 16:17 : → swhaaaaa:function的回傳值就可以了 這純粹只是個實驗 08/16 16:17 : → CaptainH:你根本不知道為什麼要加上 do{ }while(0) .. 08/16 16:56 : → CaptainH:照你的code會被展開成 if( do{...}while(0); ) 08/16 16:57 : → CaptainH:你認為這語法是對的嗎? 08/16 16:57 : → swhaaaaa:do while(0)只是避免在使用的時候語法錯誤 08/16 22:03 : → swhaaaaa:我會發問只是因為我想到寫macro可以使用do while(0) 08/16 22:07 : → swhaaaaa:但是在if使用時有語法錯誤,想問問各位是否有我所不知道 08/16 22:08 : → swhaaaaa:或者我有地方用錯,可以就可以不能這樣用就不能這樣用 08/16 22:09 : → swhaaaaa:我會再發言是因為LPH66說:倒不是什麼東西不能使用多行 08/16 22:10 : → swhaaaaa:才想是不是真的可以用,可以不要用問句來回答問題,謝謝 08/16 22:11 你這個回答正好證明了 CaptainH 的猜測: 你對在 macro 裡寫 do { ... } while(0) 的原因是一知半解 那與其用這個一知半解的東西還不如不要用 (嘛, 不過還是要給一下正確的知識: 參閱本版 #1DmPUtv4 及該篇推文 簡單的說那是限定使用情境下的寫法 並不是到處都能用的 雖然看起來很像) 看完了那篇再回來你的問題就會發現 這裡你一知半解地用了 do { ... } while(0) 反而把事情複雜化了 你這裡只不過是要讓 ishigh(data) 根據狀況算出一個 true 或 false 而已 那麼就簡單一點吧 回歸 macro 最開始學到的寫法 #define ishigh(data) (((data) & 0x01) != 0) (我知道有人想把 != 0 拿掉, 不過行行好, 在這裡請不要給初學者困擾 XD) 有一句話要記起來: 雖然函式型的 macro 看起來像函式 但那個 200% 不是函式 所以在你分不清一般函式跟函式型 macro 的時候請不要用這種 macro 更何況是寫到要分行的 macro 那種東西平常其實是很少碰到的 在我看來寫到要分行的 macro 不是太長就是太大塊 太長的就算了 太大塊的其實真的不適合寫成 macro 還不如獨立寫成函式 而如果你真的對獨立寫成函式感到有速度上的不安的話 (雖然那 95% 都是錯覺 XD) 那就把 inline 貼在函式前面吧 (←這個才是四樓推文想跟你說的) -- 実琴:「河野!你真的就這樣被物質慾望給吸引過去了嗎?!」 亨:「只要穿著女裝擺出親切的樣子,所有必要花費就能全免,似乎一點都不壞啊。」 実琴:「難道你沒有男人的尊嚴了嗎?!」 亨:(斷然道)「沒有。在節衣縮食生活吃緊學生面前,沒有那種東西。」 --プリンセス・プリンセス 第二話 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.41.36.168
swhaaaaa:OK謝謝你清楚詳細的回答我知道了 08/16 22:37
swhaaaaa:另外do while(0)的用意,你說我一知半解,除了我所說的 08/16 22:39
swhaaaaa:避免語法的錯誤,還有其他意義嗎?或者我的認知是錯誤的 08/16 22:40
swhaaaaa:還有把!=拿掉是我慣用而已,如果會造成誤解,很抱歉 08/16 22:40
LPH66:就只是文中說的 那種寫法有限定情境 雖然很多時候都能用 08/16 22:41
LPH66:但並不是所有地方都可以用 該篇推文就有例子說明 ?: 中不行 08/16 22:42
LPH66:你這裡就是另一個不行的地方: if/for/while 的 () 裡 08/16 22:42
LPH66:再者 也不是所有的 macro 都能加 08/16 22:43
LPH66:你這裡就是一個例子: 單獨的運算式加了會有反效果 08/16 22:44
swhaaaaa:恩,我一開始也是只有寫單行,用dowhile只是想試試看而已 08/16 22:44
swhaaaaa:謝謝你的回答 08/16 22:45
tac0wu:linux kernel 裡面很多這種用法 08/17 00:01
xxxx9659:do{...}while(0) 不會有任何回傳值 所以 if 根本無從判斷 08/17 05:20
xxxx9659:這問題跟 macro 比較無關,跟語法錯誤比較有關 08/17 05:20
xxxx9659:所以才會被說一知半解 08/17 05:21
xxxx9659:int a = if(1){...}; //語法有錯 如果你看得出這個錯誤 08/17 05:21
xxxx9659:if( do{...}while(0) ){...} //那你也應該看得出這錯誤 08/17 05:21
Ebergies:這種 while(0) 其實有點莫名其妙 = = 08/17 16:13
sunneo:do-while(0)只是包裝成需要分號的functional-like macro 08/17 21:39
hakman:是避免語法的錯誤 但是大家說的是你不懂語法哪有錯誤 08/18 06:09
hakman:你必須搞懂macro 在做甚麼,你才會知道哪裡出錯 08/18 06:10
hakman:另外,大家說的語法錯誤是 C的語法錯誤,而不是macro的語法 08/18 06:11
hakman:強硬死記哪邊不能用macro 倒不如去知道macro 實際做了甚麼 08/18 06:12
swhaaaaa:謝謝各位的回答,下次有疑惑也希望各位解惑 08/19 10:09