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没有伴随错误时,有没有真实的生活情况?
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)
如果突然不再编译那就太愚蠢了。
因此,现实世界中这并不表明您有错误的情况几乎不存在,但编译器也必须考虑想象世界的问题,因为有时现实世界变得非常不真实。显示警告对我来说似乎是一个很好的权衡:编译器告诉您不确定这是否是您真正想要的。
要点是,编译器编写者不能使其成为错误,因为它在语法上是有效的。如果您想将其视为代码中的错误,它可能不会给您带来任何问题。