当C4930 Visual C ++警告未指示错误时,是否存在真实案例?

时间:2011-03-22 07:00:53

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

在下列情况下,Visual C ++可以发出C4930 "unused function prototype" warning

void SomeUsefulFunction()
{
    SomeResourceLock lock(); //C4930 - unused function prototype
    //code requiring the above lock
}

在上面的代码中,目的是构造一个堆栈分配的RAII对象:

void SomeUsefulFunction()
{
    SomeResourceLock lock; //okay
    //code requiring the above lock
}

但是由于括号是类型变量定义变成了函数原型,因此没有构造RAII对象,也没有“锁定”对象,代码行为也发生了变化。

此警告仅在未使用的原型位于函数内部而非类级别时触发。在函数中使用函数原型并且不调用原型函数似乎没用。

现在我很想使用pragma warning使Visual C ++将该特定警告视为错误。

当C4930没有出现错误时,是否存在任何真实情况?

4 个答案:

答案 0 :(得分:2)

从您自己的链接

  

当编译器无法区分函数原型声明和函数调用时,也会发生C4930。

当然,单凭这一点可能不足以让我们将该警告视为错误。如果编译器感到困惑,那么阅读代码的人可能也会如此,而且无论如何它应该不那么模糊。

答案 1 :(得分:2)

说实话,我编写了“将警告视为错误”,所有警告,我认为这是一个明智的决定。在第一次启用此功能时,您将花费一些时间在构建清理之前修复所有警告,从那里清除任何引入的警告的额外成本往往很小,并且它们确实捕获了一些错误。

当然,关于警告在任何情况下是否都不是错误。对于该特定警告,假设您在命名空间中声明了一个函数并使用它,稍后在一些重构中您的代码不再需要该函数。如果删除该调用,编译器将触发该警告,并且在该特定情况下没有任何内容被破坏。不过,正如我已经说过的那样,我会删除声明以进行无警告构建。

答案 2 :(得分:2)

C ++使得制作函数本地声明变得合法,尽管我很少看到使用此功能。这通常是一个错误,但是,例如,如果您真的使用了这样的声明并调用了匹配函数:

int main()
{
    int foo();
    return foo();
}

然后删除了函数调用:

int main()
{
    int foo();
    return 0;
}

如果它突然不再编译,那将是愚蠢的。

所以,现实情况下,这并不表示你的结果是错误的,但是编译器也必须考虑到虚构的世界问题,因为有时现实世界变得非常不真实。对我来说,显示警告似乎是一个很好的权衡:编译器告诉你它不确定它是否是你真正想要的。

重点是,编译器编写者不能使它成为错误,因为它在语法上是有效的。如果您希望将其视为代码中的错误,则可能不会对您造成任何问题。

答案 3 :(得分:0)

void UnusedFunctionPrototype();