我正在开发一个Windows应用商店应用,只是将Visual Studio的警告级别提高到4级,所以我一直在修复未引用的参数警告。在这个过程中,我注意到未引用的框架管理参数(^)不像其他未引用的“形式”参数那样生成C4100警告。说明我的意思:
void Method(CNonFrameworkManaged* pObject)
{
// Warning C4100: 'pObject' : unreferenced formal parameter
}
void Method(CFrameworkManaged^ spObject)
{
// No warning
}
为什么第二个不会产生警告?有没有办法打开这样的警告?我希望我的代码看起来一致,但是手动跟踪所有这些代码需要几天......
注意:我在没有CLR支持的情况下编译我的项目,但似乎仍然可以检测到这些。
答案 0 :(得分: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'