在C ++ / CX中,为什么不引用hat ^参数会产生警告?

时间:2013-04-15 04:30:56

标签: visual-c++ compiler-warnings c++-cx visual-c++-2012

我正在开发一个Windows应用商店应用,只是将Visual Studio的警告级别提高到4级,所以我一直在修复未引用的参数警告。在这个过程中,我注意到未引用的框架管理参数(^)不像其他未引用的“形式”参数那样生成C4100警告。说明我的意思:

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

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

为什么第二个不会产生警告?有没有办法打开这样的警告?我希望我的代码看起来一致,但是手动跟踪所有这些代码需要几天......

注意:我在没有CLR支持的情况下编译我的项目,但似乎仍然可以检测到这些。

1 个答案:

答案 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'