当不存在return语句时,为什么没有编译器错误? [英] Why there is no compiler error when return statement is not present?

查看:54
本文介绍了当不存在return语句时,为什么没有编译器错误?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

与Java不同,在C/C ++中,允许:

Unlike Java, in C/C++ following is allowed:

int* foo ()
{
  if(x)
    return p;
// what if control reaches here
}

这通常会导致崩溃并难以调试问题.为什么 standard 对非 void 函数不强制具有最终回报?(编译器针对错误的 return 值生成错误)

This often causes crashes and hard to debug problems. Why standard doesn't enforce to have final return for non-void functions ? (Compilers generate error for wrong return value)

gcc/msvc中是否有任何标志可以强制执行此操作?(类似于 -Wunused-result )

Is there any flag in gcc/msvc to enforce this ? (something like -Wunused-result)

推荐答案

不允许(未定义行为).但是,在这种情况下,该标准不需要诊断.

It is not allowed (undefined behaviour). However, the standard does not require a diagnostic in this case.

由于这样的代码,该标准不需要最后一个语句为 return :

The standard doesn't require the last statement to be return because of code like this:

while (true) {
  if (condition) return 0;
}

这总是返回0,但是哑编译器看不到它.请注意,该标准未强制要求智能编译器.在 while 块之后的 return 语句将是一种浪费,愚蠢的编译器将无法对其进行优化.该标准不希望程序员仅为了满足愚蠢的编译器编写浪费的代码.

This always returns 0, but a dumb compiler cannot see it. Note that the standard does not mandate smart compilers. A return statement after the while block would be a waste which a dumb compiler would not be able to optimise out. The standard does not want to require the programmer to write waste code just to satisfy a dumb compiler.

g ++ -Wall足够聪明,可以在我的计算机上发出诊断信息.

g++ -Wall is smart enough to emit a diagnostic on my machine.

这篇关于当不存在return语句时,为什么没有编译器错误?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆