【问题标题】:In C++/CX, why don't unreferenced hat ^ parameters generate warnings?在 C++/CX 中,为什么未引用的 hat ^ 参数不生成警告?
【发布时间】:2013-04-15 04:30:56
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • “我在不支持 CLR 的情况下编译我的项目”C++/CX 和 C++/CLI 是相互排斥的:没有办法在单个项目中将 C++/CX 与“CLR 支持”结合起来。

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


【解决方案1】:

帽子类型是智能指针的一种形式,因此每个帽子类型都有一个析构函数,它释放指向对象的所有权。虽然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'

【讨论】:

  • 谢谢,这是一个很好的答案。我相信这也引出了一个问题,即注释掉未引用的 ^ 参数的名称是否允许编译器删除对智能指针构造函数/析构函数的调用?
  • @FrolickingFerret:无论参数是否有名称,行为都是相同的。也就是说,在许多情况下,编译可以忽略对 AddRef 和 Release 的调用,因为编译器完全了解 COM 引用计数的工作原理(与 shared_ptr 引用计数的工作原理相反——对编译器而言,a shared_ptr 与任何其他类型一样)。我可以写一个更深入的解释,但可能不会在星期五之前。
  • 这很有趣。编译器能够对帽子应用省略是有道理的。我并没有真正考虑过它与 shared_ptr 之类的东西。 t
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-28
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多