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
.
它是不允许的(未定义的行为).但是,该标准在这种情况下不需要诊断.
该标准不需要最后一个语句,return
因为这样的代码:
while (true) {
if (condition) return 0;
}
Run Code Online (Sandbox Code Playgroud)
这总是返回0,但是一个愚蠢的编译器看不到它.请注意,该标准并未强制要求使用智能编译器.一个return
后声明while
块是其中一个愚蠢的编译器将不能够优化了浪费.该标准不希望程序员编写废弃代码只是为了满足一个愚蠢的编译器.
g ++ -Wall非常聪明,可以在我的机器上发出诊断信息.