为什么返回语句不存在时没有编译器错误?

iam*_*ind 15 c c++ return-value compiler-flags language-lawyer

与Java不同,在C/C++中允许使用以下内容:

int* foo ()
{
  if(x)
    return p;
// what if control reaches here
}
Run Code Online (Sandbox Code Playgroud)

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

gcc/msvc中是否有任何标志来强制执行此操作?(像-Wunused-result)

Pri*_*ley 12

使用-Wall标志gcc.

 warning: control reaches end of non-void function
Run Code Online (Sandbox Code Playgroud)

编辑:或更具体地说-Wreturn-type.

  • @TJ`main()`不需要包含显式的`return`值; 从Bjarne Stroustrup网站上看到http://www2.research.att.com/~bs/bs_faq2.html#void-main (3认同)

n. *_* m. 9

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

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

while (true) {
  if (condition) return 0;
}
Run Code Online (Sandbox Code Playgroud)

这总是返回0,但是一个愚蠢的编译器看不到它.请注意,该标准并未强制要求使用智能编译器.一个return后声明while块是其中一个愚蠢的编译器将不能够优化了浪费.该标准不希望程序员编写废弃代码只是为了满足一个愚蠢的编译器.

g ++ -Wall非常聪明,可以在我的机器上发出诊断信息.

  • "请注意,该标准并没有强制要求智能编译器." +1. (2认同)