[問題] 請問if判斷式裡是否可以用macro做condition

看板C_and_CPP作者 (路人甲)時間10年前 (2013/08/16 09:23), 編輯推噓2(2038)
留言40則, 9人參與, 最新討論串1/3 (看更多)
我的程式碼如下 #define ishigh(data) \ do{ \ (( data & 0x01 )^ 0x00); \ }while(0) int main(int argc, char const *argv[]) { int data = 1; if(ishigh(data);) { fprintf(stderr, "%s[%d] \n", __FUNCTION__, __LINE__); } else { fprintf(stderr, "%s[%d] \n", __FUNCTION__, __LINE__); } return 0; } 編譯結果為error: expected expression before ‘do’ 請問一下如何寫才是對的 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 餵入的資料(Input): 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 49.218.5.191

08/16 09:42, , 1F
if() 裡面應該不能吃 {} 的字元,移掉 do, while(0)
08/16 09:42, 1F

08/16 12:28, , 2F
如果你只是要用在if裡面沒必要用do while guard 吧@@
08/16 12:28, 2F

08/16 12:29, , 3F
另外if(isxxxx();) <- 不能有分號
08/16 12:29, 3F

08/16 12:34, , 4F
不能直接inline?
08/16 12:34, 4F

08/16 14:46, , 5F
OK,我了解了,因為我試驗看看可不可以這樣寫,謝謝各位
08/16 14:46, 5F

08/16 14:47, , 6F
這樣是不是意味著condition不能使用多行macro來實作
08/16 14:47, 6F

08/16 14:48, , 7F
inline我沒試過,有人試過嗎?
08/16 14:48, 7F

08/16 15:26, , 8F
倒不是什麼東西不能使用多行 macro
08/16 15:26, 8F

08/16 15:26, , 9F
你得要知道 macro 對你的程式做了什麼事
08/16 15:26, 9F

08/16 15:27, , 10F
macro 會直接把內容給代換進使用處
08/16 15:27, 10F

08/16 15:28, , 11F
所以你要看代換之後程式還能不能用
08/16 15:28, 11F

08/16 15:29, , 12F
而且 macro 的寫法也是要看用法而定的
08/16 15:29, 12F

08/16 16:16, , 13F
那以if的condition來看,如果我要用macro做多個運算後再
08/16 16:16, 13F

08/16 16:16, , 14F
做判斷這樣辦的到嗎?
08/16 16:16, 14F

08/16 16:17, , 15F
那以這個case要用do while(0)預防錯誤是否可行
08/16 16:17, 15F

08/16 16:17, , 16F
我這個問題其實只是想試看看用macro來做,不然其使用
08/16 16:17, 16F

08/16 16:17, , 17F
function的回傳值就可以了 這純粹只是個實驗
08/16 16:17, 17F

08/16 16:56, , 18F
你根本不知道為什麼要加上 do{ }while(0) ..
08/16 16:56, 18F

08/16 16:57, , 19F
照你的code會被展開成 if( do{...}while(0); )
08/16 16:57, 19F

08/16 16:57, , 20F
你認為這語法是對的嗎?
08/16 16:57, 20F

08/16 22:03, , 21F
do while(0)只是避免在使用的時候語法錯誤
08/16 22:03, 21F

08/16 22:07, , 22F
我會發問只是因為我想到寫macro可以使用do while(0)
08/16 22:07, 22F

08/16 22:08, , 23F
但是在if使用時有語法錯誤,想問問各位是否有我所不知道
08/16 22:08, 23F

08/16 22:09, , 24F
或者我有地方用錯,可以就可以不能這樣用就不能這樣用
08/16 22:09, 24F

08/16 22:10, , 25F
我會再發言是因為LPH66說:倒不是什麼東西不能使用多行
08/16 22:10, 25F

08/16 22:11, , 26F
才想是不是真的可以用,可以不要用問句來回答問題,謝謝
08/16 22:11, 26F

08/16 22:22, , 27F
你可以多看看開源套件是怎麼寫的 你的需求只要連if一起包在
08/16 22:22, 27F

08/16 22:23, , 28F
macro裡就行 另外不懂就不懂 不要硬扯一堆 明眼人一看就知
08/16 22:23, 28F

08/16 22:24, , 29F
到你的問題跟程度 沒必要硬撐
08/16 22:24, 29F

08/16 22:29, , 30F
我會問就是不懂,我也很努力在說明我會這樣做的出發點
08/16 22:29, 30F

08/16 22:30, , 31F
用if直接帶進去這我也想過這樣做也是可行的
08/16 22:30, 31F

08/16 22:31, , 32F
我的想法只是在condition中是否可以用macro作多行運算
08/16 22:31, 32F

08/16 22:33, , 33F
如果我的macro跟一般基本if的語法使用沒錯,只是加在一起
08/16 22:33, 33F

08/16 22:34, , 34F
不行,而不是有我不知道的用法這樣,我的問題就得到解答
08/16 22:34, 34F

08/16 22:35, , 35F
謝謝ah7675的回答
08/16 22:35, 35F

08/16 22:46, , 36F
謝謝各位的回文
08/16 22:46, 36F

08/19 15:40, , 37F
do while(); <=分號忘了加?
08/19 15:40, 37F

08/19 15:58, , 38F
分號是故意不加,因為預期使用時 macro 後面會接分號。
08/19 15:58, 38F

08/19 15:59, , 39F
就是為了讓真正使用的時候可以加分號所以才不加
08/19 15:59, 39F

08/19 15:59, , 40F
樓樓上贏惹 XD
08/19 15:59, 40F
文章代碼(AID): #1I3Nyhx4 (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1I3Nyhx4 (C_and_CPP)