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

sha*_*oth 9 c++ warnings compiler-warnings visual-c++

在下列情况下,Visual C++可以发出C4930"未使用的函数原型"警告:

void SomeUsefulFunction()
{
    SomeResourceLock lock(); //C4930 - unused function prototype
    //code requiring the above lock
}
Run Code Online (Sandbox Code Playgroud)

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

void SomeUsefulFunction()
{
    SomeResourceLock lock; //okay
    //code requiring the above lock
}
Run Code Online (Sandbox Code Playgroud)

但由于括号是键入的变量定义变成了函数原型,所以没有构造RAII对象,也没有"锁定"对象,代码行为也发生了变化.

此外,仅当未使用的原型在函数内部而不是在类级别时才会触发警告.在函数内部使用函数原型并且不调用prototyped函数似乎没用.

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

当C4930没有伴随错误时,有没有真实的生活情况?

zne*_*eak 2

C++ 使得函数局部声明变得合法,尽管我很少看到这个特性被使用。这通常是一个错误,但例如,如果您确实使用了这样的声明并调用了匹配的函数:

int main()
{
    int foo();
    return foo();
}
Run Code Online (Sandbox Code Playgroud)

然后后来删除了函数调用:

int main()
{
    int foo();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果突然不再编译那就太愚蠢了。

因此,现实世界中这并不表明您有错误的情况几乎不存在,但编译器也必须考虑想象世界的问题,因为有时现实世界变得非常不真实。显示警告对我来说似乎是一个很好的权衡:编译器告诉您不确定这是否是您真正想要的。

要点是,编译器编写者不能使其成为错误,因为它在语法上是有效的。如果您想将其视为代码中的错误,它可能不会给您带来任何问题。