原創文件,歡迎閱讀,禁止轉載。linux
問題描述網絡
你見過一個這樣的bool值嗎,判斷 var 和 !var 都是成立的,今天被我遇到了,是在一個坑裏遇到的。
今天調試了一個程序,發送一個網絡消息,結果老是得不到迴應,深刻排查發現,居然是由於一個具備4年工做經驗的同事張某的不良編碼風格埋下的坑,真是汗。編碼
在C++中,bool值的隨機值多是任意的,不必定是咱們覺得的0/1,
而不一樣的系統中對bool值的判斷也是搞笑。
我把代碼簡化一下來講明問題。spa
代碼演示debug
typedef struct { bool resp; //是否反饋 char* ret; //執行結果 }ARG; int main(int argc,char* argv[]) { ARG argSt; //argSt.resp=true;//這裏的bool值不初始化 printf("resp:%d\n",argSt.resp); if( argSt.resp ) { puts("YES"); } if( !argSt.resp ) { puts("NO"); } }
Windows的結果:調試
resp:44 YES
linux的結果:code
resp:112 YES NO
結果解釋:blog
從運行結果看出,Windows沒問題,若是未初始化,debug版直接停止進程。
而linux中:
若是是int類型,則0就是假,其餘都是真;而bool類型卻不是這樣;bool類型若是未初始化,則判斷真也成立,假也成立,徹底是亂來。若是初始化了,無論初始化爲多少,都能像int判斷真假同樣了。
這裏說清楚了這個問題,應該算是運行庫的缺陷吧。
總結:
必須有良好的編碼風格,未初始化這種毛病是不能容忍的。
原創文件,歡迎閱讀,禁止轉載。進程