2013-04-15 22 views
0

我正在使用Windows應用商店應用,並將Visual Studio的警告等級提高到4,所以我一直在解決未引用的參數警告。在這個過程中,我注意到未引用的框架管理參數(^)不會像其他未引用的「形式」參數一樣生成C4100警告。爲了說明我的意思:在C++/CX中,爲什麼不重新引用hat ^參數會生成警告?

void Method(CNonFrameworkManaged* pObject) 
{ 
    // Warning C4100: 'pObject' : unreferenced formal parameter 
} 

void Method(CFrameworkManaged^ spObject) 
{ 
    // No warning 
} 

爲什麼第二不產生警告?有沒有辦法打開這樣的警告?我想我的代碼看起來一致,但手動跟蹤所有這些將需要幾天..

注意:我正在編譯我的項目沒有CLR支持,但它似乎應該仍然是可檢測的。

+0

「我在我的編譯沒有CLR支持的項目「C++/CX和C++/CLI是互斥的:在單個項目中沒有辦法將C++/CX與」CLR支持「結合起來。 –

回答

4

帽子類型是智能指針的一種形式,所以每個帽子類型都有一個析構函數,它釋放指向對象的所有權。雖然spObject未在源代碼中被名稱引用,但該對象是引用的,它是由函數結尾的編譯器生成的對析構函數的調用引用的。

當編譯器檢查未引用的局部變量時,它會找到此引用並且不會發出警告。一個普通的(非參數)局部變量必須有一個名稱,如果編譯器針對僅存在於本地變量中的局部變量發出「未引用局部變量」警告(例如,類似於lock_guard的RAII類型),將會產生問題。對未引用的非參數局部變量發出警告C4101和C4189。 (?。難道編譯器治療參數可能有所不同,但事實並非如此)

觀察到,C4100是不是該有一個析構型的任何參數發出:

struct A { }; 
struct B { ~B() { } }; 

void f(A a) { } // C4100 is issued for 'a' 
void f(B b) { } // C4100 is not issued for 'b' 
+0

謝謝,這是一個很好的答案。我相信它也提出了是否註釋掉unreferenced參數的名稱是否允許編譯器刪除對智能指針構造函數/析構函數的調用? – FrolickingFerret

+0

@FrolickingFerret:無論參數是否具有名稱,行爲都是相同的。也就是說,在許多情況下,編譯可以在調用AddRef和Release時放在帽子上,因爲編譯器完全知道COM引用計數的工作方式(與shared_ptr引用計數的工作方式相反 - 即編譯器,a shared_ptr和其他類型一樣)。我可以寫一個更深入的解釋,但可能不是在星期五之前。 –

+0

這非常有趣。編譯器能夠將elision應用於帽子是有道理的。我沒有真正考慮過像shared_ptr這樣的事情。 Ť – FrolickingFerret

相關問題