Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这个C++;没有end return语句的代码编译?_C++_Visual Studio 2005 - Fatal编程技术网

C++ 这个C++;没有end return语句的代码编译?

C++ 这个C++;没有end return语句的代码编译?,c++,visual-studio-2005,C++,Visual Studio 2005,我遇到了以下编译良好的代码(使用Visual Studio 2005): 如果方法末尾没有return语句,为什么要编译它?这是为了支持与C的向后兼容性,而C并不严格要求从所有函数返回。在这些情况下,返回位置(堆栈或寄存器)只剩下最后一个值 如果这是在没有警告的情况下编译的,尽管您可能没有将错误级别设置得足够高。大多数编译器现在都会对此发出警告。将警告级别设置为4并进行试用。并非所有控件路径返回的值都是我记得收到此警告的警告。可能您的特定编译器的流控制分析做得不够好 您使用的是哪种编译器版本,使

我遇到了以下编译良好的代码(使用Visual Studio 2005):


如果方法末尾没有return语句,为什么要编译它?

这是为了支持与C的向后兼容性,而C并不严格要求从所有函数返回。在这些情况下,返回位置(堆栈或寄存器)只剩下最后一个值


如果这是在没有警告的情况下编译的,尽管您可能没有将错误级别设置得足够高。大多数编译器现在都会对此发出警告。

将警告级别设置为4并进行试用。并非所有控件路径返回的值都是我记得收到此警告的警告。

可能您的特定编译器的流控制分析做得不够好


您使用的是哪种编译器版本,使用的是哪种开关进行编译?

可以编写保证始终返回值的代码,但编译器可能无法理解这一点。一个简单的例子是:

int func(int x)
{
    if(x > 0)
        return 1;
    else if(x == 0)
        return 0;
    else if(x < 0)
        return -1;
}
int func(int x)
{
如果(x>0)
返回1;
else如果(x==0)
返回0;
else如果(x<0)
返回-1;
}
就编译器而言,所有3个
if
语句的计算结果都可能为
false
,在这种情况下,控件将从函数末尾脱落,返回未定义的结果。但从数学上讲,我们知道这是不可能的,所以这个函数定义了行为

是的,一个更智能的编译器也许能够解决这个问题,但是想象一下,在整数比较中,我们调用了在单独的转换单元中定义的外部函数。然后,作为人类,我们可以证明所有的控制路径都返回值,但编译器肯定无法理解这一点

允许这样做的原因是为了与C兼容,而C允许这样做的原因是为了与C标准化之前(ANSI之前)编写的遗留C代码兼容。有一些代码正是这样做的,所以为了让这些代码保持有效和无错误,C标准允许这样做。但是,让控件脱离函数而不返回值仍然是未定义的行为


任何体面的编译器都应该对此提出警告;根据编译器的不同,您可能必须将警告级别调高。我相信GCC的警告选项是<代码> Wextra < /C++ >,它也包括一堆其他警告。有趣的是,上面的代码将在visual studio中编译。“为每个”是一个扩展到C++在VS 2005 5.WOW中呈现。我不知道。这是一个C++/.NET扩展吗?不仅是C++/CLI,这个扩展也适用于本机VC++
int func(int x)
{
    if(x > 0)
        return 1;
    else if(x == 0)
        return 0;
    else if(x < 0)
        return -1;
}