在下列情况下,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没有出现错误时,是否存在任何真实情况?
答案 0 :(得分:2)
从您自己的链接
当编译器无法区分函数原型声明和函数调用时,也会发生C4930。
当然,单凭这一点可能不足以让我们将该警告视为错误。如果编译器感到困惑,那么阅读代码的人可能也会如此,而且无论如何它应该不那么模糊。
答案 1 :(得分:2)
说实话,我编写了“将警告视为错误”,所有警告,我认为这是一个明智的决定。在第一次启用此功能时,您将花费一些时间在构建清理之前修复所有警告,从那里清除任何引入的警告的额外成本往往很小,并且它们确实捕获了一些错误。
当然,关于警告在任何情况下是否都不是错误。对于该特定警告,假设您在命名空间中声明了一个函数并使用它,稍后在一些重构中您的代码不再需要该函数。如果删除该调用,编译器将触发该警告,并且在该特定情况下没有任何内容被破坏。不过,正如我已经说过的那样,我会删除声明以进行无警告构建。
答案 2 :(得分:2)
C ++使得制作函数本地声明变得合法,尽管我很少看到使用此功能。这通常是一个错误,但是,例如,如果您真的使用了这样的声明并调用了匹配函数:
int main()
{
int foo();
return foo();
}
然后删除了函数调用:
int main()
{
int foo();
return 0;
}
如果它突然不再编译,那将是愚蠢的。
所以,现实情况下,这并不表示你的结果是错误的,但是编译器也必须考虑到虚构的世界问题,因为有时现实世界变得非常不真实。对我来说,显示警告似乎是一个很好的权衡:编译器告诉你它不确定它是否是你真正想要的。
重点是,编译器编写者不能使它成为错误,因为它在语法上是有效的。如果您希望将其视为代码中的错误,则可能不会对您造成任何问题。
答案 3 :(得分:0)
void UnusedFunctionPrototype();