无法访问的代码,但没有任何警告
Unreachable code, but without any warning
经过将近一个小时的调试,我终于发现在 return 语句后缺少分号。这是简化版
void PrintNumber(int value) {
cout << value << endl;
}
void BuggyFunction(int value)
{
if (value == 0)
return
PrintNumber(value);
}
是的,永远不会调用 PrintNumber。但是编译器(VS 2015)是沉默的。这种行为有原因吗?
嗯,从技术上讲,您的函数(由于缺少分号)解释如下:
void BuggyFunction(int value) {
if (value == 0) {
return PrintNumber(value);
}
}
因为 PrintNumber
也有 void
作为 return 类型,这个语句在句法上是完全合法的,虽然它显然没有多大意义。
请注意,C++ 编译器不关心缩进。如果你想正确地限定语句和变量的范围,请使用大括号(就像我在上面的代码片段中所做的那样)以避免混淆。
您的代码等同于:
void BuggyFunction(int value)
{
if (value == 0)
{
return PrintNumber(value);
}
}
由于 PrintNumber 的 return 类型为空,因此不会生成任何与可疑隐式类型转换相关的编译器警告。
如果您的编译器生成了 "unreachable code" 警告,那将是错误的,因为您编写的所有代码都是可访问的。
经过将近一个小时的调试,我终于发现在 return 语句后缺少分号。这是简化版
void PrintNumber(int value) {
cout << value << endl;
}
void BuggyFunction(int value)
{
if (value == 0)
return
PrintNumber(value);
}
是的,永远不会调用 PrintNumber。但是编译器(VS 2015)是沉默的。这种行为有原因吗?
嗯,从技术上讲,您的函数(由于缺少分号)解释如下:
void BuggyFunction(int value) {
if (value == 0) {
return PrintNumber(value);
}
}
因为 PrintNumber
也有 void
作为 return 类型,这个语句在句法上是完全合法的,虽然它显然没有多大意义。
请注意,C++ 编译器不关心缩进。如果你想正确地限定语句和变量的范围,请使用大括号(就像我在上面的代码片段中所做的那样)以避免混淆。
您的代码等同于:
void BuggyFunction(int value)
{
if (value == 0)
{
return PrintNumber(value);
}
}
由于 PrintNumber 的 return 类型为空,因此不会生成任何与可疑隐式类型转换相关的编译器警告。
如果您的编译器生成了 "unreachable code" 警告,那将是错误的,因为您编写的所有代码都是可访问的。