其他分享
首页 > 其他分享> > c – 如果函数没有返回值,并且返回类型有效,编译器是否可以抛出垃圾?

c – 如果函数没有返回值,并且返回类型有效,编译器是否可以抛出垃圾?

作者:互联网

如果函数的返回类型不是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-3,garbage,c,return-value,initialization
来源: https://codeday.me/bug/20190915/1806024.html