如果一个函数的返回类型不是void,并且该函数不返回任何东西,那么我猜编译器将返回一个垃圾值(可能被视为未初始化的值)。它在编译时发生,那么为什么不显示错误呢?

例如,

int func1() {
    return; // error
}

int func2() {
    // does not return anything
}

第二个func2应该抛出错误,但不会。有什么理由吗?我的想法是,可以将其视为未初始化的值,因此,如果在第二种情况下需要引发错误,则在未初始化值的情况下需要引发错误,例如
  int i;  // error
  int i = 6;  // okay

有什么想法,或者这是重复的问题?我感谢您的帮助。

最佳答案

在C++中,此类代码具有未定义的行为:



大多数编译器会针对类似于该问题的代码产生警告。

C++标准不要求这是编译时错误,因为在一般情况下,很难正确确定代码是否实际上在函数末尾运行,或者函数是否通过异常(或longjmp)退出,或类似机制)。

考虑

int func3() {
    func4();
}

如果func4()抛出,那么此代码就可以了。编译器可能看不到func4()的定义(由于单独的编译),因此无法知道它是否会抛出。

此外,即使编译器可以证明func4()不会抛出,它仍然必须证明func3()实际上在被合法拒绝程序之前就已被调用。这种分析需要检查整个程序,这与单独的编译不兼容,在一般情况下甚至是不可能的。

关于c++ - 如果函数不返回任何值,且返回类型为有效,编译器是否可以返回垃圾?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9936011/

10-12 02:05