c++ - 如果一个函数没有返回值,但返回类型有效,编译器是否可以返回垃圾?

标签 c++ c return-value initialization garbage

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

例如,

int func1() {
    return; // error
}

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

第二个 func2 应该抛出一个错误,但它不会。有什么原因吗?我的想法是,它可以看作是一个未初始化的值,所以如果我们需要在第二种情况下抛出错误,那么我们需要抛出错误,如果一个值未初始化,比如说

  int i;  // error
  int i = 6;  // okay

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

最佳答案

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

[stmt.return]/2 ... Flowing off the end of a function is equivalent to a return with no value; this results in undefined behavior in a value-returning function. ...

大多数编译器都会对与问题中的代码类似的代码产生警告。

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

考虑

int func3() {
    func4();
}

如果 func4() 抛出,那么这段代码完全没问题。编译器可能看不到func4()的定义(因为单独编译),所以不知道会不会抛出。

此外,即使编译器可以证明 func4() 没有抛出异常,它仍然必须证明 func3() 确实被调用才能合法地调用拒绝程序。这种分析需要对整个程序进行检查,这与单独编译是不兼容的,在一般情况下甚至是不可能的。

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

相关文章:

c++ - OpenCV:归一化图像的像素值

C++ `digits10` 对于 IEEE float 是 6,但第一个不可表示的整数已经有 8 位数字?

无法将 mbedtls 添加到项目

c - Cudamalloc 的神秘段错误

c - 返回时 double 会四舍五入

c++ - C++ 编译器中的 C 代码

c# - WinForm 不接收消息,除非在创建后立即接收消息

java - 从父类(super class)获取返回整数值

c++ - GCC 链接静态库

linux - 如何从 system() 获取自定义返回值