代码之家  ›  专栏  ›  技术社区  ›  deworde

C++是否强制执行返回语句?

  •  7
  • deworde  · 技术社区  · 15 年前

    好吧,我用C++编译器发现了一个小古怪。

    这是我的问题:这是编译器错误,还是不能保证C++编译器在非空返回函数中强制执行返回语句的需要?

    哦,说得清楚一点,在这种情况下,它是一个不必要的if语句,没有附带的else。没有目标,没有出口,没有中止。

    3 回复  |  直到 15 年前
        1
  •  13
  •   anon anon    14 年前

    我个人认为这应该是一个错误:

    int f() {
    }
    
    int main() {
        int n = f();
        return 0;
    }
    

    但大多数编译器都将其视为警告,您甚至可能需要使用编译器开关来获取该警告。例如,在g++上,您需要-Wall来获得:

    [neilb@GONERIL NeilB]$ g++ -Wall nr.cpp
    nr.cpp: In function 'int f()':
    nr.cpp:2: warning: no return statement in function returning non-void
    

        2
  •  13
  •   Johannes Schaub - litb    15 年前

    不能保证C++编译器会执行这个操作。C++函数可以通过编译器未知的机制跳出其控制流。当C++被用来编写OS内核时,上下文切换就是其中的一个例子。被调用函数(其代码不一定对调用方可用)引发的未捕获异常是另一个异常。

        3
  •  4
  •   Jere.Jones    15 年前

    编译器不会强制执行这一点,因为您知道哪些路径实际上可能是编译器不可能的。编译器通常只知道特定的文件,而不知道可能影响任何给定函数内部流的其他文件。所以,这不是一个错误。

    不过,在visualstudio中,这是一个警告。我们应该注意所有的警告。。。。是吗?:)

    编辑

    enum TriBool { Yes, No, Maybe };
    
    TriBool GetResult(int input) {
        if (TestOne(input)) {
            return Yes;
        } else if (TestTwo(input)) {
            return No;
        }
    }
    

    记住C++不是保护你自己。它是让你在语言的约束下做你内心渴望的事情,即使这包括射中你自己的脚。