2009-01-22 21 views

回答

23

當您有與另一個類型聲明相矛盾的一個類型聲明(一個表示「class」,另一個表示「struct」)時,會顯示此警告。給定一個定義規則,除最多一個之外的所有聲明都必須是前向聲明。警告通常會表明某種類型的前向聲明是錯誤的,通常是簡單的錯字,應該修復。在這種情況下,應該沒有副作用,但你應該修復它。

但是,如果您有類型名稱衝突(可能是由於使用「使用名稱空間」子句或全局命名空間污染引起的),可能會出現一些非常令人討厭的事情。這些警告可能表示您正在混合來自兩個不同庫的頭文件,並且類型名稱具有衝突。在這些條件下編譯的代碼可能會做一些非常意外的事情

我的建議 - 理解爲什麼警告已經出現並修復它。如果警告發生在第三方產品中,請堅持要求解決。

+0

偉大的建議,謝謝。 – 2009-01-22 10:59:18

+2

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

1

雖然這被認爲是不好的做法,我認爲混合類定義和結構聲明應該沒有問題,因爲它們基本上是相同的數據類型。主要的區別在於,結構成員默認是公共的,與私有的類成員相反,否則內存佈局是相同的。

+1

在使用不同名稱修改算法的編譯器上可能會有問題。 – MSalters 2009-01-22 13:27:15

0

在C++ 只有一個類和一個結構的區別是該類的成員和函數默認是私有的,而在一個結構中它們默認是public;所以,班級是POD的事實在這裏不應有任何改變。
我想這個警告來自代碼維護(定義更新某處,但不是別的地方),並修復代碼,以便警告消失(例如在typedef中使用類)。

4

只是將MSalters的評論反對this帖子發表到最高層。在使用名稱中的'class'或'struct'關鍵字時,我有幾個很難找到鏈接器錯誤。

如果你不指望它是一個問題,你可以留下幾個小時頭!

1

Richard Corden是正確的 - MS有這個警告是有原因的。裝飾(損壞)名稱包括類型名稱是哪個類鍵(結構或類)。如果一個函數或方法將某個對象作爲參數或返回該對象,當錯誤的類關鍵字可見時就會引用該函數或方法,您將不會收到編譯錯誤,但鏈接器會發出抱怨,因爲裝飾的名稱不同。鏈接器錯誤只顯示它正在查找的符號,並且很容易忽略那裏的類關鍵不匹配,因此較早的更詳細的編譯器警告很有價值。當然,這兩個版本仍然可能不會出現在同一個編譯單元中,如果您認爲唯一的區別是默認成員可見性,您可能會在一段時間內摸不着頭腦。

2

我在我的博客文章「Is C4099 really a sillywarning?"」中深入討論了此警告。我的結論是,它最好是關閉。:-)嗯,至少對我而言。

1

有一件事我看到,可能會導致此警告是試圖從DLL導入.tlb文件,同時也有相同的DLL作爲項目中的引用。我只是通過從我的項目中刪除DLL作爲參考來解決此問題。

相關問題