[問題] 編譯器 關掉特定 warning

看板C_and_CPP作者 (嘎嘎嘎嘎嘎)時間11年前 (2013/03/14 11:56), 編輯推噓7(7044)
留言51則, 13人參與, 最新討論串1/5 (看更多)
程式常常寫錯,為了比較好 debug 所以編譯的時候會對 gcc 下 -Wall 跟 -Werror 參數 對於一些我覺得不太重要的 warning 不知道怎麼關掉 例如,我想要把這兩個 warning 關掉 void fn1(){ int a = 1; (a == 10) && printf("a 等於 10\n"); // warning: value computed is not used } void fn2(){ int a; // 這個程式還沒開始寫,只是先寫出架構 // warning: unused variable 'a' } 上網查到這樣可以關 #pragma warning(push) #pragma warning(disable : warning id ) //程式... #pragma warning(pop) 但是我不知道這兩個 warning 的 id 是多少 請問 warning id 有表可以查嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.60.254.15

03/14 12:03, , 1F
就編一次之後看 compiler 的那些 warning 給什麼編號
03/14 12:03, 1F
編譯的時候只有錯誤的行數編號,沒有 warning 編號 Q_Q 顯示 warning 訊息像這樣 $ gcc -Wall test.c test.c: In function ‘SelectVertexByCare’: test.c:699: error: unused variable ‘c’ test.c: In function ‘DisconnectedRule’: test.c:832: error: unused variable ‘isFind’ test.c: In function ‘ReductionRules’: test.c:863: error: value computed is not used test.c:868: error: value computed is not used

03/14 12:59, , 2F
google "Diagnostic Pragmas"
03/14 12:59, 2F

03/14 13:04, , 3F
其實我是非常不建議用 && || 去代替 if
03/14 13:04, 3F

03/14 13:05, , 4F
除了害新手可能一時之間看不懂外,並沒有什麼幫助。
03/14 13:05, 4F
因為程式可以長這樣 bool isSuccess = false; isSuccess = isSuccess || PlanA(); //先做 A 計畫 isSuccess = isSuccess || PlanB(); //如果 A 計畫失敗,才做 B 計畫 isSuccess = isSuccess || PlanC(); //連 B 計畫也失敗,才做 C 計畫 isSuccess = isSuccess || Error(); //上面都失敗,就顯示錯誤 這樣寫感覺很優雅,隨時可以在新增 Plan

03/14 13:53, , 5F
-Wno-unused-variable
03/14 13:53, 5F
樓上謝啦 對 gcc 加了這兩個參數 -Wno-unused-value 跟 -Wno-unused-variable 就可以把上面講的兩個 warning 關掉了!! 剛剛發現原來 -Wall 就是下面這堆參數的簡寫 http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wall-260 雖然還是不知道 #pragma warning(disable : ... ) 這種用法怎麼用 但是已經解決我的問題了

03/14 14:38, , 6F
我不會去把警告關掉,我會去把警告修正
03/14 14:38, 6F
這樣的確是好習慣,但是程式寫到一半明明知道那是假警告還要去改,會改到煩...

03/14 16:16, , 7F
優雅個雕... 拿邏輯運算的副作用去做branch... 還不如
03/14 16:16, 7F

03/14 16:17, , 8F
用mpl還比你好看
03/14 16:17, 8F

03/14 16:34, , 9F
可是副作用的 short-circuit evaluation 一定會成立阿
03/14 16:34, 9F

03/14 16:34, , 10F
可攜性100% 讚讚
03/14 16:34, 10F

03/14 16:38, , 11F
就只是能耍帥而已,一點都不優雅
03/14 16:38, 11F

03/14 16:42, , 12F
#pragma warning(disable:...) 好像是 VC only 的東西
03/14 16:42, 12F

03/14 16:44, , 13F
不過反正編譯器看到看不懂的 #pragma 會略過所以...
03/14 16:44, 13F

03/14 16:44, , 14F
VC 的 error/warning 是都有編號的沒錯
03/14 16:44, 14F
懂了,所以說 #pragma warning(disable : ... ) 這種用法是專門給 VC 用的?

03/14 16:55, , 15F
03/14 16:55, 15F

03/14 16:57, , 16F
如果要比改的程度... 你的寫法跟if-else差沒多少
03/14 16:57, 16F

03/14 16:58, , 17F
阿 true/false 相反了, 改一下就好
03/14 16:58, 17F

03/14 17:02, , 18F
喔喔喔~ 這就是傳說中的 C++11 的威力嗎 有點強!!
03/14 17:02, 18F

03/14 17:03, , 19F
居然可以把 function 存在陣列裡面!!
03/14 17:03, 19F
剛剛想了其他在 C 裡面的寫法 if( PlanA() ){ return; } if( PlanB() ){ return; } if( PlanC() ){ return; } if( PlanD() ){ return; } if( Error() ){ return; } 優點: 好看!每行都一樣!而且不用了解 OR 運算的副作用 缺點: 會 return 掉,底下的程式不做 if( PlanA() == flase ){ //如果 PlanA() 失敗 if( PlanB() == flase ){ //如果 PlanB() 失敗 if( PlanC() == flase ){ //如果 PlanC() 失敗 if( PlanD() == flase ){ //如果 PlanD() 失敗 Error(); } } } 優點: 很直覺 缺點: 糟了!是世界奇觀! if( PlanA() ){ }else if( PlanB() ){ }else if( PlanC() ){ }else if( PlanD() ){ }else{ Error(); } 優點: 沒有太多 if 套坎,也可以隨時添加或註解 Plan 缺點: 是 if 的大括號裡面不寫東西,覺得有點不習慣

03/14 17:10, , 20F
c語言就有 pointer to function 可以作類似的事...
03/14 17:10, 20F

03/14 17:10, , 21F
用 function 是因為可以接 lambda 來統一一些需要參數
03/14 17:10, 21F

03/14 17:11, , 22F
函式的介面
03/14 17:11, 22F

03/14 17:12, , 23F
先把 language feature 用盡, 用到沒招再來考慮非人類
03/14 17:12, 23F

03/14 17:12, , 24F
的寫法...
03/14 17:12, 24F
lambda 完全不熟,感覺很好用...

03/14 17:28, , 25F
for(;;) {
03/14 17:28, 25F

03/14 17:29, , 26F
if (PlanA()) break;
03/14 17:29, 26F

03/14 17:29, , 27F
if (PlanB()) break;
03/14 17:29, 27F

03/14 17:29, , 28F
...
03/14 17:29, 28F

03/14 17:30, , 29F
Error();
03/14 17:30, 29F

03/14 17:30, , 30F
break;
03/14 17:30, 30F

03/14 17:31, , 31F
} // 這樣呢? 可以不用 if 大括號
03/14 17:31, 31F

03/14 17:31, , 32F
被斷了 冏
03/14 17:31, 32F

03/14 17:33, , 33F
不小心插隊... 用 for 迴圈好像是剛剛 case 裡最好的一個
03/14 17:33, 33F
修一下 ※ 編輯: xxxx9659 來自: 61.60.254.19 (03/14 17:37)

03/14 17:37, , 34F
原PO優雅做法的前提,不就是 PlanA() 失敗時,不用做任何
03/14 17:37, 34F

03/14 17:39, , 35F
動作,可以直接衝去跑 PlanB()。再者 if 不用套坎的寫法
03/14 17:39, 35F

03/14 17:40, , 36F
選擇也很多。就算真的失敗就要 return 也可以用 dtor 做
03/14 17:40, 36F

03/14 17:40, , 37F
所謂底下的程式
03/14 17:40, 37F

03/14 17:42, , 38F
上面打錯:PlanA 失敗時不用動作,只需要成功時跑 PlanB
03/14 17:42, 38F

03/14 19:04, , 39F
可以不要砍來砍去的嗎, 那個字念「ㄑㄧㄢ」(嵌)
03/14 19:04, 39F

03/14 19:07, , 40F
一點都不優雅.....
03/14 19:07, 40F

03/14 19:48, , 41F
我不是要你完全不用 && 和 ||,只是說外層起碼擺個 if
03/14 19:48, 41F

03/14 19:49, , 42F
你怎麼完全不考慮傳統的 if(A && B) 或 if (A || B) 呢...
03/14 19:49, 42F

03/14 19:55, , 43F
真要講求優雅你可以直奔 chain-of-responsibility pattern
03/14 19:55, 43F

03/14 21:43, , 44F
gcc 4.7 警告後面會跟你講是哪個選項來的
03/14 21:43, 44F

03/14 21:43, , 45F
例如 warning: unused variable ‘a’ [-Wunused-variable]
03/14 21:43, 45F

03/14 23:13, , 46F
03/14 23:13, 46F

03/15 01:37, , 47F
樓上的程式一定要 C++11 才可以跑嗎 還是只要 C++ 就好
03/15 01:37, 47F

03/15 01:37, , 48F
要怎麼學習這種程式寫法,有推薦的書嗎
03/15 01:37, 48F

03/15 10:16, , 49F
拿掉Varadic Template你預設的標準就能跑了
03/15 10:16, 49F

03/15 12:09, , 50F
剛看到的 http://ppt.cc/uTAd
03/15 12:09, 50F

03/17 04:55, , 51F
.......我會建議改用CoR Pattern
03/17 04:55, 51F
文章代碼(AID): #1HGKfadg (C_and_CPP)
文章代碼(AID): #1HGKfadg (C_and_CPP)