最近應需要,對項目中的warning進行清除,感覺PG對Linux和Windows下編程的差異性認識不夠,衍生出了不少編譯Warning,我只能悲催的幫其進行修復。C++沒有Java那麼隨意,作為項目中的底層,重視Warnig,一來可以保持代碼的健壯性,修復潛在的Bug。另外,考慮日後供給第三方作為lib,保持0 Warning就是必須了。下面,介紹主要遇到的Warning產生點:
注:測試推薦使用在線編譯器 http://codepad.org/)
1.format warning
如果你用 %x 十六進制打印信息的話,稍不留意可能就是warning了。十六進制本身是無符號的,但是它所匹配的類型是unsigned int。在Windows中,int和long被認為是一樣的,但是Linux下,long != intLinux下,long與機器字長相關,32位機子占用4個字節,64位機子是8個字節;而Windows中均為4個字節,等同於int)。所以用 %x 匹配 unsigned long是不行的。
2.comparison warning
當signed變量和unsigned變量比較時,就會產生此類警告。比如,我們使用sizeof和strlen時候,習慣依照其返回類型用size_t接收返回值,此時直接和int或者long類型變量做比較,則會出現warning。size_t是標准C庫中定義的,應為unsigned int,但在64位系統中為long unsigned int。如果出現此類情況非得比較,比較好的建議是,做無符號像有符號轉換。
3.reorder initialize warning
這個出現於類的使用過程中,主要是在構造函數用初值表進行成員變量的初始化時,成員的初始化順序與類中定義的順序不一致導致。G++進行編譯,會發現該問題。
4.missing braces warning
當結構體嵌套使用,初始化不規范,會產生此類警告。
struct INER{ int m_i; }; struct EXTE{ INER m_iner; int m_i; };
定義了以上結構,初始化的時候我們如果簡單的賦值0的話,工具檢測時就得爆出數條warning了,所以需要注意下。
EXTE exte={0};
遇到結構體變量的初始化,還是推薦使用memset函數以避免不必要的麻煩。
暫時列出幾個容易忽略的問題,有機會再進行補充,以後編碼時,多注意規范,避免不必要的Warning。
本文出自 “felix” 博客,請務必保留此出處http://felixhwang.blog.51cto.com/3263859/1269403