【问题标题】:Is omitting return when calling a function undefined behaviour in C/C++? [duplicate]在 C/C++ 中调用函数未定义行为时是否省略返回? [复制]
【发布时间】:2021-12-16 13:28:29
【问题描述】:

我最近遇到了一个具有以下结构的函数的 C 代码:

int fun1(int x){
    return x + 2;
}
int fun2(int x){
    fun1(x);
}

int main()
{
    printf("%d\n", fun2(5));

    return 0;
}

函数 f2 中似乎缺少 return 语句:

return fun1(x);

但是它按预期工作,并且调用 fun2(5) 返回 7。这种类型的隐式返回是未定义的行为,还是已定义并且可以跨不同的编译器和 C/C++ 标准工作?

【问题讨论】:

  • It's undefined behavior in C 如果尝试使用返回值。
  • 不知道是什么编译器让它通过的?
  • 我遇到的引发这个问题的原始代码是用 gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44) 编译的,我的问题中发布的代码是在 onlinegdb 中编译和运行的: onlinegdb.com/online_c_compiler我不知道他们用的是什么编译器
  • 这在 C 和 C++ 中是不同的,因此将其标记为两者会混淆问题。现在有一个 C 的答案,但闭包是 C++ 问题的副本。那是一团糟。除非询问两种语言之间的差异或交互,否则不要同时标记 C 和 C++。
  • @cigien:我没有为此挑选出典型的问题。那个看起来还行至少,我刚刚尝试的一些搜索并没有找到更好的搜索结果。

标签: c++ c return undefined-behavior


【解决方案1】:

这是undefined behavior,至少对于 C.

不允许从函数返回值失败,然后尝试使用返回值。这在C standard 的第 6.9.1p12 节中详细说明了函数定义:

如果到达终止函数的},并且 函数调用被调用者使用,行为未定义。

注意,这意味着如果您没有尝试使用返回值,那将不是未定义的行为。

【讨论】:

  • 在这种情况下,C 和 C++ 之间的唯一(实际)区别是,如果使用返回值,则行为仅在 C 中未定义,但在 C++ 中,从非void 函数是导致未定义行为的原因(main() 除外,这是一种特殊情况)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-27
  • 1970-01-01
  • 2015-05-26
  • 1970-01-01
  • 2015-03-28
  • 2015-07-14
  • 1970-01-01
相关资源
最近更新 更多