0

我正在开发一个 Windows 应用商店应用程序,并且刚刚将 Visual Studio 的警告级别提高到 4,因此我一直在修复未引用的参数警告。在此过程中,我注意到未引用的框架管理参数 (^) 不会像其他未引用的“正式”参数一样生成 C4100 警告。为了说明我的意思:

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

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

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

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

4

1 回答 1

4

hat 类型是智能指针的一种形式,因此每个 hat 类型都有一个析构函数,它释放指向对象的所有权。虽然spObject在源代码中没有按名称引用,但该对象编译器生成的函数末尾的析构函数调用引用。

当编译器检查未引用的局部变量时,它会找到该引用并且不会发出警告。一个普通的(非参数)局部变量必须有一个名称,如果编译器对这些仅存在被销毁的局部变量(例如,RAII 类型,如lock_guard)发出“未引用的局部变量”警告,那将是有问题的。针对未引用的非参数局部变量发出警告 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'
于 2013-04-19T00:56:06.060 回答