无法访问的代码,但没有任何警告

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" 警告,那将是错误的,因为您编写的所有代码都是可访问的。