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

时间:2016-09-06 15:52:54

标签: c++ compiler-warnings

经过近一个小时的调试,我终于在一个return语句后发现了缺少的分号。这是简化版

void PrintNumber(int value) {
    cout << value << endl;
}

void BuggyFunction(int value)
{
    if (value == 0)
        return

    PrintNumber(value);
}

是的,PrintNumber永远不会被调用。但编译器(VS 2015)是沉默的。这种行为有原因吗?

2 个答案:

答案 0 :(得分:4)

嗯,从技术上讲,你的功能(由于缺少分号)解释如下:

void BuggyFunction(int value) {
    if (value == 0) {
      return PrintNumber(value);
    }
}

由于PrintNumber也有void作为返回类型,因此这句话在句法上是完全合法的,尽管它显然没有多大意义。

请注意,C ++编译器并不关心缩进。如果要正确定义语句和变量,请使用大括号(就像我在上面的代码片段中所做的那样)以避免混淆。

答案 1 :(得分:2)

您的代码相当于:

void BuggyFunction(int value)
{
    if (value == 0)
    {
        return PrintNumber(value);
    }
}

由于PrintNumber的返回类型为void,因此不会生成与可疑隐式类型转换相关的任何编译器警告。

如果你的编译器生成了一个&#34;无法访问的代码&#34;警告,这是错误的,因为你写的所有代码都是可以访问的。