推 LPH66:就編一次之後看 compiler 的那些 warning 給什麼編號 03/14 12:03
編譯的時候只有錯誤的行數編號,沒有 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
→ linotwo:google "Diagnostic Pragmas" 03/14 12:59
→ tinlans:其實我是非常不建議用 && || 去代替 if 03/14 13:04
→ tinlans:除了害新手可能一時之間看不懂外,並沒有什麼幫助。 03/14 13:05
因為程式可以長這樣
bool isSuccess = false;
isSuccess = isSuccess || PlanA(); //先做 A 計畫
isSuccess = isSuccess || PlanB(); //如果 A 計畫失敗,才做 B 計畫
isSuccess = isSuccess || PlanC(); //連 B 計畫也失敗,才做 C 計畫
isSuccess = isSuccess || Error(); //上面都失敗,就顯示錯誤
這樣寫感覺很優雅,隨時可以在新增 Plan
→ silentlich:-Wno-unused-variable 03/14 13:53
樓上謝啦
對 gcc 加了這兩個參數 -Wno-unused-value 跟 -Wno-unused-variable
就可以把上面講的兩個 warning 關掉了!!
剛剛發現原來 -Wall 就是下面這堆參數的簡寫
http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wall-260
雖然還是不知道 #pragma warning(disable : ... ) 這種用法怎麼用
但是已經解決我的問題了
→ diabloevagto:我不會去把警告關掉,我會去把警告修正 03/14 14:38
這樣的確是好習慣,但是程式寫到一半明明知道那是假警告還要去改,會改到煩...
→ loveme00835:優雅個雕... 拿邏輯運算的副作用去做branch... 還不如 03/14 16:16
→ loveme00835:用mpl還比你好看 03/14 16:17
→ xxxx9659:可是副作用的 short-circuit evaluation 一定會成立阿 03/14 16:34
→ xxxx9659:可攜性100% 讚讚 03/14 16:34
推 purpose:就只是能耍帥而已,一點都不優雅 03/14 16:38
推 LPH66:#pragma warning(disable:...) 好像是 VC only 的東西 03/14 16:42
→ LPH66:不過反正編譯器看到看不懂的 #pragma 會略過所以... 03/14 16:44
→ LPH66:VC 的 error/warning 是都有編號的沒錯 03/14 16:44
懂了,所以說 #pragma warning(disable : ... ) 這種用法是專門給 VC 用的?
→ loveme00835:如果要比改的程度... 你的寫法跟if-else差沒多少 03/14 16:57
→ loveme00835:阿 true/false 相反了, 改一下就好 03/14 16:58
→ xxxx9659:喔喔喔~ 這就是傳說中的 C++11 的威力嗎 有點強!! 03/14 17:02
→ xxxx9659:居然可以把 function 存在陣列裡面!! 03/14 17:03
剛剛想了其他在 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 的大括號裡面不寫東西,覺得有點不習慣
→ loveme00835:c語言就有 pointer to function 可以作類似的事... 03/14 17:10
→ loveme00835:用 function 是因為可以接 lambda 來統一一些需要參數 03/14 17:10
→ loveme00835:函式的介面 03/14 17:11
→ loveme00835:先把 language feature 用盡, 用到沒招再來考慮非人類 03/14 17:12
→ loveme00835:的寫法... 03/14 17:12
lambda 完全不熟,感覺很好用...
推 lausai:for(;;) { 03/14 17:28
→ lausai: if (PlanA()) break; 03/14 17:29
→ lausai: if (PlanB()) break; 03/14 17:29
→ lausai: ... 03/14 17:29
→ lausai: Error(); 03/14 17:30
→ lausai: break; 03/14 17:30
→ lausai:} // 這樣呢? 可以不用 if 大括號 03/14 17:31
→ lausai:被斷了 冏 03/14 17:31
→ xxxx9659:不小心插隊... 用 for 迴圈好像是剛剛 case 裡最好的一個 03/14 17:33
修一下
※ 編輯: xxxx9659 來自: 61.60.254.19 (03/14 17:37)
推 purpose:原PO優雅做法的前提,不就是 PlanA() 失敗時,不用做任何 03/14 17:37
→ purpose:動作,可以直接衝去跑 PlanB()。再者 if 不用套坎的寫法 03/14 17:39
→ purpose:選擇也很多。就算真的失敗就要 return 也可以用 dtor 做 03/14 17:40
→ purpose:所謂底下的程式 03/14 17:40
→ purpose:上面打錯:PlanA 失敗時不用動作,只需要成功時跑 PlanB 03/14 17:42
→ uranusjr:可以不要砍來砍去的嗎, 那個字念「ㄑㄧㄢ」(嵌) 03/14 19:04
推 legendmtg:一點都不優雅..... 03/14 19:07
→ tinlans:我不是要你完全不用 && 和 ||,只是說外層起碼擺個 if 03/14 19:48
→ tinlans:你怎麼完全不考慮傳統的 if(A && B) 或 if (A || B) 呢... 03/14 19:49
→ tinlans:真要講求優雅你可以直奔 chain-of-responsibility pattern 03/14 19:55
→ akasan:gcc 4.7 警告後面會跟你講是哪個選項來的 03/14 21:43
→ akasan:例如 warning: unused variable ‘a’ [-Wunused-variable] 03/14 21:43
→ xxxx9659:樓上的程式一定要 C++11 才可以跑嗎 還是只要 C++ 就好 03/15 01:37
→ xxxx9659:要怎麼學習這種程式寫法,有推薦的書嗎 03/15 01:37
→ loveme00835:拿掉Varadic Template你預設的標準就能跑了 03/15 10:16
推 Killercat:.......我會建議改用CoR Pattern 03/17 04:55