這個警告有什麼好擔心的嗎?我讀過它會導致不穩定的行爲?警告C4099:使用'結構'(MS VS 2k8)使用'class'首次看到的類型名稱
這是我想編譯的一個例子,有人可以向我解釋爲什麼作者聲明該對象爲一個類,但然後typedef它的結構?如果班級是POD,這樣做是否正常?
謝謝。
這個警告有什麼好擔心的嗎?我讀過它會導致不穩定的行爲?警告C4099:使用'結構'(MS VS 2k8)使用'class'首次看到的類型名稱
這是我想編譯的一個例子,有人可以向我解釋爲什麼作者聲明該對象爲一個類,但然後typedef它的結構?如果班級是POD,這樣做是否正常?
謝謝。
當您有與另一個類型聲明相矛盾的一個類型聲明(一個表示「class」,另一個表示「struct」)時,會顯示此警告。給定一個定義規則,除最多一個之外的所有聲明都必須是前向聲明。警告通常會表明某種類型的前向聲明是錯誤的,通常是簡單的錯字,應該修復。在這種情況下,應該沒有副作用,但你應該修復它。
但是,如果您有類型名稱衝突(可能是由於使用「使用名稱空間」子句或全局命名空間污染引起的),可能會出現一些非常令人討厭的事情。這些警告可能表示您正在混合來自兩個不同庫的頭文件,並且類型名稱具有衝突。在這些條件下編譯的代碼可能會做一些非常意外的事情
我的建議 - 理解爲什麼警告已經出現並修復它。如果警告發生在第三方產品中,請堅持要求解決。
雖然這被認爲是不好的做法,我認爲混合類定義和結構聲明應該沒有問題,因爲它們基本上是相同的數據類型。主要的區別在於,結構成員默認是公共的,與私有的類成員相反,否則內存佈局是相同的。
在使用不同名稱修改算法的編譯器上可能會有問題。 – MSalters 2009-01-22 13:27:15
在C++ 只有一個類和一個結構的區別是該類的成員和函數默認是私有的,而在一個結構中它們默認是public;所以,班級是POD的事實在這裏不應有任何改變。
我想這個警告來自代碼維護(定義更新某處,但不是別的地方),並修復代碼,以便警告消失(例如在typedef中使用類)。
只是將MSalters的評論反對this帖子發表到最高層。在使用名稱中的'class'或'struct'關鍵字時,我有幾個很難找到鏈接器錯誤。
如果你不指望它是一個問題,你可以留下幾個小時頭!
Richard Corden是正確的 - MS有這個警告是有原因的。裝飾(損壞)名稱包括類型名稱是哪個類鍵(結構或類)。如果一個函數或方法將某個對象作爲參數或返回該對象,當錯誤的類關鍵字可見時就會引用該函數或方法,您將不會收到編譯錯誤,但鏈接器會發出抱怨,因爲裝飾的名稱不同。鏈接器錯誤只顯示它正在查找的符號,並且很容易忽略那裏的類關鍵不匹配,因此較早的更詳細的編譯器警告很有價值。當然,這兩個版本仍然可能不會出現在同一個編譯單元中,如果您認爲唯一的區別是默認成員可見性,您可能會在一段時間內摸不着頭腦。
我在我的博客文章「Is C4099 really a sillywarning?"」中深入討論了此警告。我的結論是,它最好是關閉。:-)嗯,至少對我而言。
有一件事我看到,可能會導致此警告是試圖從DLL導入.tlb文件,同時也有相同的DLL作爲項目中的引用。我只是通過從我的項目中刪除DLL作爲參考來解決此問題。
偉大的建議,謝謝。 – 2009-01-22 10:59:18
MS Mangling Scheme http://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B_Name_Mangling#Data_Type:`union`編碼爲`T`,`struct`爲`U`和`class`爲`V` 。 – 2011-02-01 19:46:15